Тёмный

Первый Алгоритм Для Изучения в 2024 

Саша Лукин
Подписаться 82 тыс.
Просмотров 63 тыс.
50% 1

Разбираем алгоритм, который поможет решать задачи на собеседованиях в крупные айти компании.
Подписывайтесь на мой Телеграм канал: t.me/saschalukin
Эта задача на Leetcode: leetcode.com/problems/longest...
00:00 Вступление
00:23 Условие
01:20 Решение перебором
03:59 Быстрое решение
06:37 Код

Опубликовано:

 

18 май 2024

Поделиться:

Ссылка:

Скачать:

Готовим ссылку...

Добавить в:

Мой плейлист
Посмотреть позже
Комментарии : 296   
@sashalukin
@sashalukin 21 день назад
Создал Telegram канал, в котором рассказываю о работе в Google, подготовке к собеседованиям и жизни в Лондоне. Подписывайтесь: t.me/saschalukin
@manOfPlanetEarth
@manOfPlanetEarth 19 дней назад
Саша, сделай уже, плз, плейлисты на канале☝🏼☝🏼 С задачами, пр. и тд. Скомпонуй видосы.
@albertbrawls
@albertbrawls 17 дней назад
Оаоаао что это?! Метод двух указателей!
@boriskogan-lerner7485
@boriskogan-lerner7485 7 дней назад
Если правильно понимаю, в некоторых случаях операции с хешем могут стремиться к O(logN)=> общее время будет приближаться к O(N*logN). Где N- длинна строки т.к. операции выполняются дважды, а размер сета в худшем случае будет N/2 (Среднее членов арифметической прогрессии(An+A1)/2). 1/2*2=1 П.с. Часа полтора потратил что бы понять что что-бы решит проблему коллизий при хешировании нам надо выделять примерно "очень много" памяти на каждый сет, установить жесткое ограничение в размере строки и используемом наборе символов а так же тратиться на сжать/разжать данные в этой строке
@sobirabdulxair9001
@sobirabdulxair9001 20 дней назад
один из редких каналов, где разбирают и объясняют по-человечески без лишнего пафоса. жду с нетерпением каждого разбора.
@mndevitmndevit
@mndevitmndevit 21 день назад
Как же я долго ждал нового видео, спасибо тебе огромное! Вот бы они выходили чаще)
@kirillschcerbinin7068
@kirillschcerbinin7068 20 дней назад
spasibo, Sasha za detalniy razbor. Видосы становятся все лучше и лучше по качеству, харош
@user-od1it3ru3o
@user-od1it3ru3o 20 дней назад
Саша, привет! Спасибо за интересное видео. Единственное, ты слегка меня запутал когда сказал, что "удаляем, пока в сете есть повторяющиеся символы" - по факту, в сете они не повторяются. Наверное, лучше было бы сказать что удаляем, пока не удалим ПОВТОРИВШИЙСЯ символ)
@MrKryuk
@MrKryuk 16 дней назад
Саша, спасибо за разборы. Косательно этого решения догадался про указатель `right`, что нет смысла увеличивать его, но не догадался про перемещение left.
@kuroiumi9949
@kuroiumi9949 17 дней назад
Ура ура! С возвращением, Сань :) Круто что ты стал записывать видео чаще))
@heybeachMIN
@heybeachMIN 15 дней назад
Спасибо ОГРОМНОЕ за такой подробное объяснение, всё понятно теперь) Было бы круто увидеть подобное объяснение но про деревья))
@badishow4807
@badishow4807 21 день назад
На пробнике ЕГЭ подобная задача попадалась (24-е задание). Решил очень похожим способом Видео, как всегда, интересное. Благодарю за контент!
@user-vv3gg6xm1b
@user-vv3gg6xm1b 21 день назад
тоже сдаю егэ, как раз захотел выучить алгоритм чтобы если что использовать) да и в целом полезная вещь
@romanpritkov1107
@romanpritkov1107 14 дней назад
но там тебе на сложность наплевать в егэ
@Swydk
@Swydk 21 день назад
Привет, хотел выразить тебе огромное спасибо. Посмле просмотра видео про гугл и инжерена. Мне вернулся дух программиста. Начал вести фриланс и параллельно изучаю собесы
@VDlasov
@VDlasov 19 дней назад
Было интересно изучить. Главное с апреля начать
@panfilovandrey
@panfilovandrey 18 дней назад
Очень хорошо объясняешь, респект. Алгоритм полного перебора можно немного оптимизировать, если не перебирать тупо все подстроки, а начинать с самой большой и двигаться к уменьшению, или, если уже нашли подстроку длиной 3, рассматривать только большие, это чуть-чуть сократит затраты, но, конечно, не будет лучше, чем скользящий алгоритм.
@Whispered__Wisdom
@Whispered__Wisdom 20 дней назад
Привет, пожалуста продолжай, очень полезно и информативно, сейчас активно пытаюсь прокачать алгоритмы и твои видосы прям то-что нужно!!!
@rickgmv1844
@rickgmv1844 19 дней назад
Спасибо за классное объяснение, а то я когда на литкоде пыхтел над этими задачами с окном, чуть мозг не сломал, разбирая этот алгоритм
@stas-web
@stas-web 21 день назад
Спасибо, отличная подача. Без воды и смс. Успехов.
@cablook_egja
@cablook_egja 20 дней назад
простой перебор можно сократить и до n^2, если просто обновлять сет после первого цикла а is_acceptable = True оставить на своём месте. ну и третий цикл можно будет убрать. На лит коде даже заработало. Для скользящего окна вот ещё альтернатива, с помощью словаря на python: def longest_substr(s): answer = 0 left = 0 hash_set = {} for right in range(len(s)): char = s[right] if char in hash_set and hash_set[char] >= left: left = hash_set[char] + 1 else: answer = max(answer, right - left + 1) hash_set[char] = right return answer Спасибо за видео
@kalts_daniil
@kalts_daniil 21 день назад
Я только что решал задачу: Longest Substring Without Repeating Characters, и вуаля, тут видео на sliding window подъехало 🔥 Спасибо!
@ghostlynomad7788
@ghostlynomad7788 21 день назад
Кстати на днях сидел решал эту задачу на leetcode , и она у меня не прошла последний тест из-за Time Limit Exceeded (986 / 987 testcases passed). Мой подход был такой - я собирал все уникальные подстроки (в отдельном методе я проверял что подстрока состоит из уникальных символов) в лист и затем с помощью компаратора сортировал по длине и возвращал длину последнего элемента
@user-yd9xy3rb4x
@user-yd9xy3rb4x 21 день назад
Да просто алгосы везде одинаковые +-
@user-ut8bs1ku5e
@user-ut8bs1ku5e 21 день назад
@@ghostlynomad7788 не мудрено, что по времени не прошел. Мало того, что собирал лист со сложностью n в квадрате, а то и n в кубе, так потом еще и добавил n*log(n) (я про сортировку). Ничего медленнее мне кажется тут уже не придумать))
@ghostlynomad7788
@ghostlynomad7788 21 день назад
@@user-ut8bs1ku5e больше ни до чего не додумался ) и да, сложность сборки листа n в кубе🙈
@ghostlynomad7788
@ghostlynomad7788 21 день назад
@@user-ut8bs1ku5e n в кубе на самом деле) но больше ни до чего не додумался за пару дней
@aidoka2000
@aidoka2000 21 день назад
spasibo, Sasha za detalniy razbor.
@daniyarzhanakhmetov7741
@daniyarzhanakhmetov7741 4 дня назад
Крутецки всё объяснил! Спасибо!
@user-lk8n0fgjk
@user-lk8n0fgjk 21 день назад
Отличное видео! Спасибо! Делай, пожалуйста, побольше такого контента на виды алгоритмов. И да, мы скучаем по Java)
@flake1604
@flake1604 21 день назад
За Иннополис за заднем фоне превью лайк)
@vladimira9360
@vladimira9360 21 день назад
Приятно осознавать, что я бы решил подобным образом.
@MrKirTer
@MrKirTer 14 дней назад
Спасибо! Эффективность ваших видео O(n)!
@Anonymous-6598
@Anonymous-6598 21 день назад
Отличное видео! Спасибо!
@itananas
@itananas 13 дней назад
Очень крутое объяснение, спасибо!
@auyezove
@auyezove 20 дней назад
Буду благодарен, если сделаете ролик с roadmap по алгоритмам и то какие задачи решать
@suuron
@suuron 14 дней назад
Когда это два указателя стали чем-то удивительным(учусь в школе, смотрел пару записей собесов, почти в каждом были два указателя, так что думал, что это база)
@leomysky
@leomysky 19 дней назад
Спасибо за видео, всё понятно
@auyezove
@auyezove 20 дней назад
Круто! Давно искал подобный канал с разборами задач, спасибо!
@andreyzyablikov9891
@andreyzyablikov9891 20 дней назад
Подумав, решил методом похожим на скользящее окно, правда вместо указателей я бы воспользовался List(C#, System.Collections.Generic), но не уверен, что List подойдёт по оптимизации лучше и сопоставимо, чем указатели. Спасибо за видео.
@user-ku2hc3mr3m
@user-ku2hc3mr3m 21 день назад
Очень крутое видео, спасибо!
@user-fh9dp6kg8o
@user-fh9dp6kg8o 16 дней назад
Хотелось бы больше примеров на Java ) спасибо 😊
@ArtsiomShendzikau
@ArtsiomShendzikau 19 дней назад
Спасибо за видео! Какие еще задачи можно решать методом скользящего окна?
@alexandreabramtsev9160
@alexandreabramtsev9160 18 дней назад
Я конечно дико извиняюсь, но это круто и изящно! Придумал на лету тоже вариант O(n), но он немного сложнее и кушает больше памяти - на каждый индекс массива создавать отдельный сет и добавлять в него пока "дубль" символа не встретится. Метод скользящего окна намного красивее!
@jagorrim2371
@jagorrim2371 21 день назад
Было бы интересно послушать про работу различных структур данных
@user-ut8bs1ku5e
@user-ut8bs1ku5e 21 день назад
Спасибо за видео! Сам около года назад сидел плотно в литкоде, задачи на скользящее окно были одними из любимых) Увидел условие, решил проверить сам себя, решу ли ее сейчас. Минут за 5 решил, не с первого раза, сначала подзабыл немного последовательность действий, пошел по неправильному пути. Оставлю тут свое решение (на js правда), оно немного отличается от решения в видео (вместо двух while у меня for и внутри него while, ну и без if/else, более линейно) function maxLen(str) { let maxLen = 0 let left = 0 const uniques = new Set() for (let right = 0; right < str.length; right++) { const current = str[right] while(uniques.has(current)) { uniques.delete(str[left]) left++ } uniques.add(current) maxLen = Math.max(maxLen, right - left + 1) } return maxLen } console.log(maxLen('axbxcxd')) // 3
@rof3leo
@rof3leo 21 день назад
какая асимптотика?
@user-ut8bs1ku5e
@user-ut8bs1ku5e 15 дней назад
@@rof3leo O(n) по времени и памяти
@vog25
@vog25 21 день назад
Крутое видео! А если не секрет - то чем занимаешься в гугле? Что за стек?
@user-ey9xi9dq6l
@user-ey9xi9dq6l 18 дней назад
Изначально пришёл 2 вариант на ум, до первого даже догадаться не смог. По времени заняло минуты 2-3.
@heaven7pro
@heaven7pro 13 дней назад
Это отличное объяснение, я серьёзно
@rasZam
@rasZam 21 день назад
спасибо, больше разборов задач. Не подскажете, что за второй монитор у вас?
@yuriynicom
@yuriynicom 21 день назад
Без лишних слов, Превосходный контент и знания! СПАСИБО!!!! Вопрос: Английский вариант названия алгоритма "метод скользящего окна" ? The Sliding window ?
@kusdav1etov
@kusdav1etov 20 дней назад
Да
@MrAsdimchik
@MrAsdimchik 17 дней назад
Спасибо за видео. Какой инструмент используется для демонстрации ? Очень удобно отображать скрытый код при нажатии. Сам часто делаю тех презентации и такой инструмент очень бы сильно помог, а то ливкодинг глючит )))
@user-cs7uk1fe4v
@user-cs7uk1fe4v 19 дней назад
Первый раз за 10 лет в айти нашел нормально объясняющего на русском человека. Мне это конечно не пригодится, но было интересно 👍
@sherumov6472
@sherumov6472 16 дней назад
Отличное видео, спасибо
@nabamapo
@nabamapo 21 день назад
Спасибо за видео! А что это за софт со спойлерами и где можно рисовать?
@borys7837
@borys7837 21 день назад
Избыточность в расчете answer. Его стоит пересчитывать в случае повторения буквы и последний раз когда заканчиваем всю функцию.
@crimfi
@crimfi 21 день назад
На асимптотику это не влияет, + можно написать контртест для которого пересчёт все равно будет происходить на каждом шаге
@AlexanderRadchenko
@AlexanderRadchenko 20 дней назад
Да и ещё можно оптимизировать удаление из множества. Там не нужен поиск в множестве, достаточно простого сравнения символов.
@TurboGamasek228
@TurboGamasek228 19 дней назад
@@crimfi на асимптотику не влияет, а на константу влияет
@crimfi
@crimfi 19 дней назад
@@TurboGamasek228 можно написать тест, для которого константа не изменится, при оценке рассматриваем худший случай
@AlexanderSavchenko91
@AlexanderSavchenko91 16 дней назад
спасибо интересный алгоритм!
@user-xx1ek4ct7c
@user-xx1ek4ct7c 19 дней назад
Спасибо за видео! Можете пожалуйста посоветовать с чего начать изучение алгоритмов, если только только изучил основы python?
@_AbUser
@_AbUser 21 день назад
Клевый способ. А можно подгонкой размеров окна подобным способом находить всякие локальные максимумы, точки перегиба и прочее на каком ть временном ряде? По скольку они там формируются в вообще произвольной периодичностью.. ))) Было бы как раз...
@artemkashipov9865
@artemkashipov9865 21 день назад
по моему алгоритм можно улучшить используя bitset для хранения мапы элементов и то сколько раз они встретились
@ivankondratyev2363
@ivankondratyev2363 3 дня назад
реализация "простого" решения убила... я даже и не подумал что так можно XD
@vasilekx8
@vasilekx8 21 день назад
Спасибо за видео! Немного запутанное объяснение либо такое ощущение, что какие-то кадры ошибочно вырезаны с видео. Либо плохо разобрался)
@furtherance6042
@furtherance6042 21 день назад
Прикольно. Лайк. Я только погружаюсь в программирование. Будет ли полезно в первом цикле (где увеличиваем подстроку) не прогонять её по минимальным значениям а сразу увеличить на Макс. Длинну, уже записанную в сет? Так мы пропустим (в данном примере) проверку сетов cb и db.
@rof3leo
@rof3leo 20 дней назад
@furtherance6042 если я тебя правильно понял, то, если ты будешь пропускать символы, тогда сет не будет хранить все символы подстроки => ты можешь не понять, что случился повтор
@Lammax2012
@Lammax2012 21 день назад
Кайф! Спасибо!
@kirill_monster
@kirill_monster 21 день назад
3:30 можно обойтись без флага используя такой синтаксис: for bla bla bla: print('Стоп') break else: print('Цикл завершен без остановки')
@michaelgolub2019
@michaelgolub2019 14 дней назад
Первое, что пришло в голову, это то, что Вы назвали "метод скользящего окна". Я бы, наверное, это писал на компилируемом языке, если бы такое было позволено.
@staspanyukov4822
@staspanyukov4822 16 дней назад
спасибо за видео
@oArleo
@oArleo 2 дня назад
Я бы построчным вводом добавлял , сортировал массив и сравнивал первую и вторую позиции и как только они равны записал бы размер массива-1, а потом начинал бы со второго символа.
@user-jv6sq3mz3b
@user-jv6sq3mz3b 19 дней назад
Привет! Было бы круто, если бы разобрал задачу Medium from two sorted arrays. Нигде не могу найти хорошого объяснения
@kiminomeha
@kiminomeha 19 дней назад
О да, это очень классный алгоритм. Его еще называют методом двух указателей. Все, кто к ЕГЭ по информатике готовится, учат его, довольно эффективный и гибкий алгоритм
@igorpistolyakaify
@igorpistolyakaify 17 дней назад
Приветствую, во втором случае можно немного оптимизировать решение: предположим, что есть текущая уникальная подстрока и мы нашли следующий неуникальный символ, если размер "хвоста" меньше чем размер найденной подстроки, то можно прекратить поиск и вернуть результат. Очевидно, что выигрыш невелик, но все же.
@SEIREI_MUSIC
@SEIREI_MUSIC 13 дней назад
Нормально, 24 задание ЕГЭ, поехали
@griprudnikov4374
@griprudnikov4374 21 день назад
Классное видео! А какой шрифт используется для кода?
@IgorAlov
@IgorAlov 21 день назад
Похож на courier new
@Ermorder1
@Ermorder1 20 дней назад
Неплохое решение, но вот другое - за один проход, запоминая последний индекс символа. Swift: func lengthOfLongestSubstring(_ s: String) -> Int { var map: [Character: Int] = [:] var result = 0 var left = 0 for (i, c) in s.enumerated() { if let j = map[c] { left = max(left, j + 1) } result = max(result, i - left + 1) map[c] = i } return result }
@_M.i.h.a.i.l._
@_M.i.h.a.i.l._ 19 дней назад
Попросил ИИ переписать на АХК скрипт +вернуть саму строку: lengthOfLongestSubstring(s, ByRef longestSubstring = ""){ map := {} result := 0 left := 0 longestSubstring := "" Loop, Parse, s { c := A_LoopField if (map.HasKey(c)) { left := Max(left, map[c] + 1) } result := Max(result, A_Index - left) map[c] := A_Index - 1 if result longestSubstring := SubStr(s, left, result) } } return result }
@user-zo5gt9ck9b
@user-zo5gt9ck9b 16 дней назад
на java public class LongestSubstringLength { public static int lengthOfLongestSubstring(String s) { HashMap map = new HashMap(); int result = 0; int left = 0; for (int i = 0; i < s.length(); i++) { char c = s.charAt(i); if (map.containsKey(c)) { left = Math.max(left, map.get(c) + 1); } result = Math.max(result, i - left + 1); map.put(c, i); } return result; }
@st.kevich
@st.kevich 16 дней назад
С мапой очень плохое решение. Используется доп память. И не забывайте о том как растет мапа - это тоже далеко не бесплатно.
@heybeachMIN
@heybeachMIN 15 дней назад
на питоне бы...
@bobbob-rd7yz
@bobbob-rd7yz День назад
можно просто 1 раз идти по масиву и добавлять колличество уникальних елементов до первого повоторения в новий масив, потом повторять подсчет с последнего уникального елемента, а потом просто взять наибольшое число нового масива.
@arthur.v.babayan
@arthur.v.babayan 16 дней назад
Интересно, конечно :)
@vitalylesindorf640
@vitalylesindorf640 19 дней назад
Цифры Пифагора. Если у треугольника длины сторон 3, 4 и 5 метров, то он -- прямоугольный. Или 6, 8 и 10 метров. И т. д. Эти волшебные цифры позволяют на местности рисовать прямые углы. Размечать местность под фундамент, например.
@saasrus
@saasrus 19 дней назад
А проверка того что буква уже в сете за проверку не считается и проходит мгновенно?
@fedordostoevskiy4209
@fedordostoevskiy4209 21 день назад
Я думал что stack использовать нужно. 👍
@user-vm9cs6vt1q
@user-vm9cs6vt1q 14 дней назад
Этот алгоритм напомнил мне метод указателей можно ли в данном случае его использовать?
@p4xt3r
@p4xt3r 14 дней назад
Спасибо за видео! У меня появился вопрос касательно быстрого решения. В видео говорится, что скорость O(n), но ведь по сути мы используем два цикла, один из которых вложен. представим, что в функцию отдается строка из одинаковых символов и тогда во все итерации кроме первой будет падать во вложенный цикл. а на сколько я помню скорость считается исходя из худшего случая. Почему в этом случае скорость O(n)? буду очень благодарен за ответ!
@gadpetrovich
@gadpetrovich 14 дней назад
Если исходить из худшего случая, то и set можно выкинуть, т.к. он там по добавлению будет равен O(n), а не O(1).
@Be3y4uuK0T
@Be3y4uuK0T 20 дней назад
что-то я не понял, на 5:13 мы проверяем и удаляем символы, на которые указывает left, но в алгоритме на java на 7:53 мы проверяем в while символ, на который указывает right, а не left. почему так? объясните, пожалуйста
@user-hg4ni3kr6f
@user-hg4ni3kr6f 18 дней назад
Неплохое объяснение, но не оценивается вставка и поиск в Set, интервьювер разве не укажет на этот момент?
@emptyspaces4067
@emptyspaces4067 18 дней назад
Уже несколько подобных комментов тут. Что вы так ополчились на сэты, что плохого они вам сделали?
@user-hg4ni3kr6f
@user-hg4ni3kr6f 18 дней назад
@@emptyspaces4067 "мы" это разные люди, я за себя говорю, мне стало интересно, потому что это вопрос на засыпку.
@SayXaNow
@SayXaNow 17 дней назад
@@user-hg4ni3kr6f принято считать что работа с сетом это константа. адепты лога будут негодовать, но на деле, чтобы сет постоянно уходил в лог - это надо нехило так постараться. плюс надо точно знать, а что под капотом у данной конкретной реализации сета, вдруг там реально обычное дерево, а не хэшмап. обычно совмещают оба два сразу. ну а в данной задачке, если символы ограничены - то можно реализовать свой собственный сет, который будет абсолютной константой, к которой уже невозможно будет придраться.
@user-hg4ni3kr6f
@user-hg4ni3kr6f 17 дней назад
@@SayXaNow ну вообще джавовский hashset это как раз О(1), насчет пайтона я не знаю. Просто это может быть вопрос на засыпку от интервьювера, стоит об этом помнить.
@heybeachMIN
@heybeachMIN 15 дней назад
@@user-hg4ni3kr6f у пайтона как я знаю тоже
@ArtsiomShendzikau
@ArtsiomShendzikau 19 дней назад
Вы могли записать видео про метод двух указателей?
@menceyh
@menceyh 17 дней назад
Операции над set'ом же за ln(n) выполняются. Поэтому сложность с sliding window O(n*ln(n)), а без O(n^3 * ln(n))
@maximkutkov
@maximkutkov 17 дней назад
он использовал unordered_set, где клюли хешируются за O(1)
@user-sg1ns5vx1m
@user-sg1ns5vx1m 20 дней назад
Cпасибо большое, но в медленном алгоритме благодаря break внутренний цикл выполняется не более 26 раз, поэтому решение всё-таки за квадрат.
@andreyradostny
@andreyradostny 21 день назад
🔥
@mrdastinol7007
@mrdastinol7007 21 день назад
Насколько я понимаю, удаление с начала масива очень долгое, потому что нужно создать другой масив и перекопировать все значения в него. Поэтому, когда у нас будет очень длинная подстрока, придётся много раз пересоздавать масив внутри сета. Лучше уж после каждой итерации поставить проверку (result < right - left + 1). Но может сет в Java работает не так как я думаю, надеюсь на отзыв.
@oleksandr2234
@oleksandr2234 21 день назад
Не пересоздается сет после удаления слева. Если не удалять - то не будет работать contains().
@mrdastinol7007
@mrdastinol7007 19 дней назад
@@oleksandr2234 Спасибо за ответ!
@alexnilev7779
@alexnilev7779 21 день назад
не понял на 5:16 говорится "удаляем пока в подстроке нету повторяющихся символов", хотя указатель на left - С и в подстроке остается С, тоесть они указывают на одинаковый символ , почему его он не удаляется как все предыдущие?
@user-iq9ll8lz9m
@user-iq9ll8lz9m 21 день назад
это повторяющийся символ из предыдущей подстроки, с него будет начинаться новая подстрока
@user-yy4lm3zd6c
@user-yy4lm3zd6c 18 дней назад
Хочу поделиться своим решением, на момент ответа видео не досмотрел. Сравниваем элементы с помощью бинарного дерева. В цикле начинаем сравнивать , если элемент меньше идём в лево, если равно continue. Если след узел null то тогда записываем в дерево элемент и увеличиваем count ++. После цикла выводим count. У нас получится уникальное бинарное дерево, с счётчиком count.
@emptyspaces4067
@emptyspaces4067 18 дней назад
Очень интересно, но ничего не понятно. Можно код, желательно на жабе или питоне?
@nullptr111
@nullptr111 16 дней назад
Как насчёт хэш-сета + рекурсия или это тоже будет давать O(n^2) или O(n^3)?
@alung414
@alung414 12 дней назад
Интересно, что этот алгоритм начали спрашивать сейчас. Решал его еще года 3-4 на леткоде тогда он мне попался где-то 5 по счету. То что додумался до решения сам конечно тешет мое самолюбие. Но вот то что часа полтора два у меня ушло чтобы выдать рабочий код на go нет).
@VictorVedmich
@VictorVedmich 9 дней назад
О а не подскажите через что вы делаете скрытие контента а потом его появление, по клику ?
@preved39
@preved39 10 дней назад
как все красиво и понятно, спасибо, Александр! Кстати, а где рисуется такая "интерактивная" анимация?
@xtxrnvl
@xtxrnvl 13 дней назад
Заметил Университет Иннополис на превью) Это просто случайность или ты как-то с ним связан?) я там первачок если что)
@icu4
@icu4 21 день назад
После вступления поставил на паузу, на листе пришел к такому же решению. Потом вспомнил, что данный метод как-то называется. В общем, на названия алгоритмов память не очень, но к решению подобному чисто логически прийти можно 👍 Спасибо за подробное объяснение
@YacobMonar
@YacobMonar 20 дней назад
Сначала, решил, потом глянул первое "решение перебором". Какое же оно сложное... Чёт мне кажется что до такого тяжёлого и медленного решения просто никто специально не дойдёт и использовать не будет) Гораздо же легче и понятнее добавлять в новый список по букве если она не встречается в списке, иначе срезать часть списка по символ который снова встретился(включительно), и сохранять дубликат самого длинного списка. "Правильного решения" ещё не смарел
@YacobMonar
@YacobMonar 20 дней назад
Ахаха))) Мой алгоритм оказался в два раза быстрее и проще в понимании, и написании))
@user-iu1jl3km
@user-iu1jl3km 16 дней назад
Мне кажется что первый алгоритм выполняет не n в кубе операций , а (n+n*n) /2 так как right пробегает от i до n символа, где i - положение left; у второго алгоритма максимальная скорость O(n) , а минимальная O(n*n) потому что right точно пробежит один раз строку, а left может остаться в начале (если все символы разные) или пробежать все символы (если все символы одинаковы) P. S. Укажите если не прав
@kusdav1etov
@kusdav1etov 20 дней назад
Мне еще в голову пришло решение за O(nlogn) с помощью метода фиксированного скользящего окна и бинарного поиска)
@gopnikkasarj6797
@gopnikkasarj6797 21 день назад
А если в начале строки будет самая длинная строка, а потом она измениться, то что тогда?
@niklegaloff
@niklegaloff 21 день назад
остановил на 2:07 и мне показалось что первое очевидное решение на самом деле сложное и неочевдиным, очевидным решением для меня пробежаться по всем символам с хэшсетом накапливая его и фиксируя максимальный результат при наличии символа уже в нём, при этом сбрасывая его и возвращаясь назад на величину r-1, сча посмотри какое решение предложит автор
@sb-dor
@sb-dor 21 день назад
Ребят решил вот таким способом, что думаете ? Про память да, переборщил наверное: int testAlg(String value) { int maxLength = 0; Map map = {}; for (int i = 0; i < value.length; i++) { map[value[i]] = value[i]; for (int j = i + 1; j < value.length; j++) { if (map.containsKey(value[j])) { maxLength = maxLength >= map.length ? maxLength : map.length; map.clear(); break; } else { map[value[j]] = value[j]; } } } return maxLength; } PS: мог бы использовать Set вместо Map
@user-rb5ye4jg5o
@user-rb5ye4jg5o 14 дней назад
Можно улучшить данный алгоритм до О(1) по памяти, а не О(н) как в видео, использовав массив буллов, где индекс - это номер в юникоде
@maxmoriss
@maxmoriss 18 дней назад
Элегантное решение на Python, max_length = 0 left = 0 seen = {} for right, char in enumerate(s): if char in seen: left = max(left, seen[char] + 1) seen[char] = right max_length = max(max_length, right - left + 1) return max_length
@CorWinTheOrder
@CorWinTheOrder 9 дней назад
не сработает вот на этом примере "abcbad" я когда сам решал, тоже на этом моменте спотыкался
@MichailLLevin
@MichailLLevin 21 день назад
а можно вместо set завести массив длинной в алфавит и держать в нем последний индекс, содержащий данную букву. Двигаем правый указатель, смотрим, была ли текущая буква в окне, если нет - запоминаем, идем дальше. Если буква была - стоп, проверяем, не больше ли текущее окно лучшего, если нашли лучшее - запоминаем окно и переставляем левый указатель сразу после буквы, которая повторилась. по сути - то же, но не надо двигать левый указатель по одному шагу, ну и обратиться к массиву - быстрее, чем добавлять-убирать из сета.
@jaggman2134
@jaggman2134 21 день назад
Первая мысль такая же была, только не с алфавитом, а в общем случае - хэшмапой
@rof3leo
@rof3leo 21 день назад
можно даже не индекс, а просто true, если встретилась и false, если нет. boolean меньше памяти занимает (хотя у тебя немного побыстрее работает). Потом в цикле проверяешь, если текущая буква уже встречалась, то двигаешь левый указатель, пока не уберешь предыдущее вхождение
@MichailLLevin
@MichailLLevin 19 дней назад
@@rof3leo тогда придется на каждом шаге отбегать до начала текущей последовательности?
@MichailLLevin
@MichailLLevin 19 дней назад
@@jaggman2134 честно говоря, у меня старая нелюбовь к хашмэпам, несколько раз сталкивался с тем, что сет на хэше работает в разы медленнее, чем обычный сет (вероятно на дереве). Если храним строки, получение хэша пробегает каждую строку до конца, а сравнение на < обычно кончается на первой же букве.
@thayornwarrior2785
@thayornwarrior2785 21 день назад
красавчик
@user-ze3ez3iy6c
@user-ze3ez3iy6c 18 дней назад
Я сразу додумался до решения
@lidersh.2360
@lidersh.2360 21 день назад
Это Иннополис на фоне на превью?)
@mirzomuminsobirjonov1104
@mirzomuminsobirjonov1104 21 день назад
Поставил на паузу и попробовал такое решение со скоростью алгоритма O(n): def get_the_longest_substring(string): length = 0 left = 0 seen = {} for i in range(len(string)): char = string[i] if char in seen and seen[char] >= left: diff = i - left left = seen[char] + 1 if diff > length: length = diff seen[char] = i if left == 0: return len(string) return length
@rof3leo
@rof3leo 21 день назад
а как же обращение к отображению за O(log(n)) в среднем?
@mirzomuminsobirjonov1104
@mirzomuminsobirjonov1104 19 дней назад
@@rof3leo что ты имеешь ввиду? можешь немного подробнее описать? или ты про объем памяти алгоритма спрашиваешь?
@SayXaNow
@SayXaNow 17 дней назад
​@@mirzomuminsobirjonov1104 ну многие думают, операции с сетами и словарями занимают лог времени. лично я по тестам вижу константу. кстати, твое решение через словарь медленнее, чем через сет почти в 2 раза. конечно это все равно будет линейная сложность, но в питоне похоже операции со словарем гораздо медленнее сетовых.
@mirzomuminsobirjonov1104
@mirzomuminsobirjonov1104 17 дней назад
@@SayXaNow возможно ты и прав, но при решении алгоритмов на собесе такое вряд ли рассматривают, так как это просто константа. это можно написать на компилируемом языке чтоб ускорить процесс по времени.
@eduardmart1237
@eduardmart1237 19 дней назад
А при помощи чего ты делаешь такие презентации? Ну когда кликаешь мышкой на квадрат и там открываются значения.
Далее
LOVE is BLIND but not this one 😍💍
00:20
Просмотров 12 млн
나랑 동생이 버블티 마시는법
00:13
Просмотров 2,5 млн
А может линукс
15:24
Просмотров 1 тыс.
Tesla Cybertruck review - IT'S HERE!
23:07
Просмотров 2,1 млн