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

Поділитися
Вставка
  • Опубліковано 1 січ 2025

КОМЕНТАРІ • 344

  • @sashalukin
    @sashalukin  8 місяців тому +10

    Создал Telegram канал, в котором рассказываю о работе в Google, подготовке к собеседованиям и жизни в Лондоне. Подписывайтесь: t.me/saschalukin

    • @manOfPlanetEarth
      @manOfPlanetEarth 8 місяців тому +2

      Саша, сделай уже, плз, плейлисты на канале☝🏼☝🏼 С задачами, пр. и тд. Скомпонуй видосы.

    • @albertbrawls
      @albertbrawls 8 місяців тому +1

      Оаоаао что это?! Метод двух указателей!

    • @boriskogan-lerner7485
      @boriskogan-lerner7485 7 місяців тому

      Если правильно понимаю, в некоторых случаях операции с хешем могут стремиться к O(logN)=> общее время будет приближаться к O(N*logN). Где N- длинна строки т.к. операции выполняются дважды, а размер сета в худшем случае будет N/2 (Среднее членов арифметической прогрессии(An+A1)/2). 1/2*2=1
      П.с. Часа полтора потратил что бы понять что что-бы решит проблему коллизий при хешировании нам надо выделять примерно "очень много" памяти на каждый сет, установить жесткое ограничение в размере строки и используемом наборе символов а так же тратиться на сжать/разжать данные в этой строке

  • @sobirabdulxair9001
    @sobirabdulxair9001 8 місяців тому +117

    один из редких каналов, где разбирают и объясняют по-человечески без лишнего пафоса. жду с нетерпением каждого разбора.

  • @mndevitmndevit
    @mndevitmndevit 8 місяців тому +11

    Как же я долго ждал нового видео, спасибо тебе огромное! Вот бы они выходили чаще)

  • @MrKryuk
    @MrKryuk 8 місяців тому +3

    Саша, спасибо за разборы.
    Косательно этого решения догадался про указатель `right`, что нет смысла увеличивать его, но не догадался про перемещение left.

  • @kirillschcerbinin7068
    @kirillschcerbinin7068 8 місяців тому +3

    spasibo, Sasha za detalniy razbor. Видосы становятся все лучше и лучше по качеству, харош

  • @heybeachMIN
    @heybeachMIN 8 місяців тому +2

    Спасибо ОГРОМНОЕ за такой подробное объяснение, всё понятно теперь) Было бы круто увидеть подобное объяснение но про деревья))

  • @kalts_daniil
    @kalts_daniil 8 місяців тому +20

    Я только что решал задачу: Longest Substring Without Repeating Characters, и вуаля, тут видео на sliding window подъехало 🔥 Спасибо!

    • @ghostlynomad7788
      @ghostlynomad7788 8 місяців тому +3

      Кстати на днях сидел решал эту задачу на leetcode , и она у меня не прошла последний тест из-за Time Limit Exceeded (986 / 987 testcases passed).
      Мой подход был такой - я собирал все уникальные подстроки (в отдельном методе я проверял что подстрока состоит из уникальных символов) в лист и затем с помощью компаратора сортировал по длине и возвращал длину последнего элемента

    • @Денис-ж3ф5р
      @Денис-ж3ф5р 8 місяців тому

      Да просто алгосы везде одинаковые +-

    • @Дмитрий-л3я7ы
      @Дмитрий-л3я7ы 8 місяців тому +4

      @@ghostlynomad7788 не мудрено, что по времени не прошел. Мало того, что собирал лист со сложностью n в квадрате, а то и n в кубе, так потом еще и добавил n*log(n) (я про сортировку). Ничего медленнее мне кажется тут уже не придумать))

    • @ghostlynomad7788
      @ghostlynomad7788 8 місяців тому

      @@Дмитрий-л3я7ы больше ни до чего не додумался ) и да, сложность сборки листа n в кубе🙈

    • @ghostlynomad7788
      @ghostlynomad7788 8 місяців тому

      @@Дмитрий-л3я7ы n в кубе на самом деле)
      но больше ни до чего не додумался за пару дней

  • @kuroiumi9949
    @kuroiumi9949 8 місяців тому +1

    Ура ура! С возвращением, Сань :)
    Круто что ты стал записывать видео чаще))

  • @Eldertri
    @Eldertri 8 місяців тому +14

    Саша, привет!
    Спасибо за интересное видео. Единственное, ты слегка меня запутал когда сказал, что "удаляем, пока в сете есть повторяющиеся символы" - по факту, в сете они не повторяются. Наверное, лучше было бы сказать что удаляем, пока не удалим ПОВТОРИВШИЙСЯ символ)

  • @badishow4807
    @badishow4807 8 місяців тому +43

    На пробнике ЕГЭ подобная задача попадалась (24-е задание).
    Решил очень похожим способом
    Видео, как всегда, интересное. Благодарю за контент!

    • @ЛевАронов
      @ЛевАронов 8 місяців тому +3

      тоже сдаю егэ, как раз захотел выучить алгоритм чтобы если что использовать) да и в целом полезная вещь

    • @romanpritkov1107
      @romanpritkov1107 8 місяців тому +1

      но там тебе на сложность наплевать в егэ

    • @ладно-з5б
      @ладно-з5б 7 місяців тому

      @@romanpritkov1107 не, n^3 такие задачи не делает, либо сотню условий надо проставлять, чтобы там скипало

  • @cablook_egja
    @cablook_egja 8 місяців тому +4

    простой перебор можно сократить и до 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
    Спасибо за видео

    • @TTTuTTT
      @TTTuTTT 4 місяці тому

      И даже еще проще брутфорс можно сделать - вообще без этого is_acceptable, просто если в сете есть новая буква, то выходим из второго цикла, а потом проверяем больше ли сайз нашего сета, чем наш ответ и все.

  • @user5555-s9e
    @user5555-s9e 8 місяців тому +3

    Привет, хотел выразить тебе огромное спасибо. Посмле просмотра видео про гугл и инжерена. Мне вернулся дух программиста. Начал вести фриланс и параллельно изучаю собесы

  • @stas-web
    @stas-web 8 місяців тому +1

    Спасибо, отличная подача. Без воды и смс. Успехов.

  • @Whispered__Wisdom
    @Whispered__Wisdom 8 місяців тому +1

    Привет, пожалуста продолжай, очень полезно и информативно, сейчас активно пытаюсь прокачать алгоритмы и твои видосы прям то-что нужно!!!

  • @panfilovandrey
    @panfilovandrey 8 місяців тому +1

    Очень хорошо объясняешь, респект. Алгоритм полного перебора можно немного оптимизировать, если не перебирать тупо все подстроки, а начинать с самой большой и двигаться к уменьшению, или, если уже нашли подстроку длиной 3, рассматривать только большие, это чуть-чуть сократит затраты, но, конечно, не будет лучше, чем скользящий алгоритм.

  • @borys7837
    @borys7837 8 місяців тому +6

    Избыточность в расчете answer. Его стоит пересчитывать в случае повторения буквы и последний раз когда заканчиваем всю функцию.

    • @crimfi
      @crimfi 8 місяців тому +1

      На асимптотику это не влияет, + можно написать контртест для которого пересчёт все равно будет происходить на каждом шаге

    • @AlexanderRadchenko
      @AlexanderRadchenko 8 місяців тому

      Да и ещё можно оптимизировать удаление из множества. Там не нужен поиск в множестве, достаточно простого сравнения символов.

    • @TurboGamasek228
      @TurboGamasek228 8 місяців тому

      @@crimfi на асимптотику не влияет, а на константу влияет

    • @crimfi
      @crimfi 8 місяців тому

      @@TurboGamasek228 можно написать тест, для которого константа не изменится, при оценке рассматриваем худший случай

  • @user-lk8n0fgjk
    @user-lk8n0fgjk 8 місяців тому +4

    Отличное видео! Спасибо! Делай, пожалуйста, побольше такого контента на виды алгоритмов. И да, мы скучаем по Java)

  • @rickgmv
    @rickgmv 8 місяців тому

    Спасибо за классное объяснение, а то я когда на литкоде пыхтел над этими задачами с окном, чуть мозг не сломал, разбирая этот алгоритм

  • @yerzhan_auyezov
    @yerzhan_auyezov 8 місяців тому +1

    Круто! Давно искал подобный канал с разборами задач, спасибо!

  • @leomysky
    @leomysky 6 місяців тому

    Спасибо, что сделал это ценой 2 свичей

  • @VDlasov
    @VDlasov 8 місяців тому +1

    Было интересно изучить. Главное с апреля начать

  • @Be3y4uuK0T
    @Be3y4uuK0T 8 місяців тому +2

    что-то я не понял, на 5:13 мы проверяем и удаляем символы, на которые указывает left, но в алгоритме на java на 7:53 мы проверяем в while символ, на который указывает right, а не left. почему так? объясните, пожалуйста

  • @alexnilev7779
    @alexnilev7779 8 місяців тому +3

    не понял на 5:16 говорится "удаляем пока в подстроке нету повторяющихся символов", хотя указатель на left - С и в подстроке остается С, тоесть они указывают на одинаковый символ , почему его он не удаляется как все предыдущие?

    • @АндрейБочарников-х5ъ
      @АндрейБочарников-х5ъ 8 місяців тому

      это повторяющийся символ из предыдущей подстроки, с него будет начинаться новая подстрока

  • @suuron
    @suuron 8 місяців тому +1

    Когда это два указателя стали чем-то удивительным(учусь в школе, смотрел пару записей собесов, почти в каждом были два указателя, так что думал, что это база)

  • @flake1604
    @flake1604 8 місяців тому +5

    За Иннополис за заднем фоне превью лайк)

  • @daniyarzhanakhmetov7741
    @daniyarzhanakhmetov7741 7 місяців тому

    Крутецки всё объяснил! Спасибо!

  • @ivankondratyev2363
    @ivankondratyev2363 7 місяців тому +1

    реализация "простого" решения убила... я даже и не подумал что так можно XD

  • @heaven7pro
    @heaven7pro 8 місяців тому +1

    Это отличное объяснение, я серьёзно

  • @aidoka2000
    @aidoka2000 8 місяців тому

    spasibo, Sasha za detalniy razbor.

  • @MrKirTer
    @MrKirTer 8 місяців тому

    Спасибо! Эффективность ваших видео O(n)!

  • @vladimira9360
    @vladimira9360 8 місяців тому

    Приятно осознавать, что я бы решил подобным образом.

  • @alexandreabramtsev9160
    @alexandreabramtsev9160 8 місяців тому

    Я конечно дико извиняюсь, но это круто и изящно! Придумал на лету тоже вариант O(n), но он немного сложнее и кушает больше памяти - на каждый индекс массива создавать отдельный сет и добавлять в него пока "дубль" символа не встретится. Метод скользящего окна намного красивее!

  • @artemkashipov9865
    @artemkashipov9865 8 місяців тому +3

    по моему алгоритм можно улучшить используя bitset для хранения мапы элементов и то сколько раз они встретились

  • @АндрейАртамонов-ъ6щ
    @АндрейАртамонов-ъ6щ 8 місяців тому +1

    Первый раз за 10 лет в айти нашел нормально объясняющего на русском человека. Мне это конечно не пригодится, но было интересно 👍

  • @Дмитрий-л3я7ы
    @Дмитрий-л3я7ы 8 місяців тому

    Спасибо за видео! Сам около года назад сидел плотно в литкоде, задачи на скользящее окно были одними из любимых) Увидел условие, решил проверить сам себя, решу ли ее сейчас. Минут за 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 8 місяців тому

      какая асимптотика?

    • @Дмитрий-л3я7ы
      @Дмитрий-л3я7ы 8 місяців тому

      @@rof3leo O(n) по времени и памяти

  • @andreyzyablikov9891
    @andreyzyablikov9891 8 місяців тому

    Подумав, решил методом похожим на скользящее окно, правда вместо указателей я бы воспользовался List(C#, System.Collections.Generic), но не уверен, что List подойдёт по оптимизации лучше и сопоставимо, чем указатели.
    Спасибо за видео.

  • @_AbUser
    @_AbUser 8 місяців тому +1

    Клевый способ. А можно подгонкой размеров окна подобным способом находить всякие локальные максимумы, точки перегиба и прочее на каком ть временном ряде? По скольку они там формируются в вообще произвольной периодичностью.. ))) Было бы как раз...

  • @itananas
    @itananas 8 місяців тому

    Очень крутое объяснение, спасибо!

  • @levhab
    @levhab 6 місяців тому

    Ооо, мы этот алгоритм в школе называли "Метод двух индексов". Он очень помогал в 24 задании ЕГЭ по Информатике

  • @ДениПух
    @ДениПух 8 місяців тому

    Хотелось бы больше примеров на Java ) спасибо 😊

  • @yerzhan_auyezov
    @yerzhan_auyezov 8 місяців тому

    Буду благодарен, если сделаете ролик с roadmap по алгоритмам и то какие задачи решать

  • @joyniferzagher9871
    @joyniferzagher9871 4 місяці тому +1

    Это кстати носит более распространенное название -- "метод двух указателей"

  • @Anonymous-6598
    @Anonymous-6598 8 місяців тому

    Отличное видео! Спасибо!

  • @p4xt3r
    @p4xt3r 8 місяців тому +2

    Спасибо за видео! У меня появился вопрос касательно быстрого решения. В видео говорится, что скорость O(n), но ведь по сути мы используем два цикла, один из которых вложен. представим, что в функцию отдается строка из одинаковых символов и тогда во все итерации кроме первой будет падать во вложенный цикл. а на сколько я помню скорость считается исходя из худшего случая. Почему в этом случае скорость O(n)? буду очень благодарен за ответ!

    • @gadpetrovich
      @gadpetrovich 8 місяців тому +1

      Если исходить из худшего случая, то и set можно выкинуть, т.к. он там по добавлению будет равен O(n), а не O(1).

    • @motya22
      @motya22 7 місяців тому

      Возник тот же вопрос, задал его chatGPT и он ответил, что "каждый символ строки рассматривается и обрабатывается один раз либо указателем right, либо указателем left.

  • @eduardtsuranov712
    @eduardtsuranov712 6 місяців тому

    Быстрое решение вроде как упрощенно "два указателя"(не шарю в алгоритмах). Но мне показалось, что когда мы пришли к повтору, то нет нужды уменьшать окно, можно двигать вправо ОБА указателя одновременно, ведь нас не интересуют размеры подстрок меньше максимальной из уже найденных. Вопрос правда реализуемо ли это(эффективнее), т.к. второй пункт(сужение) выполняет задачу убрать дубль.
    Чтобы продемонстрировать логику, на питоне:
    def longest_substring(s):
    left = 0
    for right in range(len(s)):
    if len(set(s[left: right + 1]))

  • @14bbb88
    @14bbb88 6 місяців тому

    У интерфейса Set, метод add и так делает проверку на наличие, можно лишний раз не вызывать contains.
    public static int longestSubstring(String in) {
    int max = 0;
    LinkedHashSet set = new LinkedHashSet();
    for (char c : in.toCharArray()) {
    while (!set.add(c)) {
    max = Math.max(max, set.size());
    set.removeFirst();
    }
    }
    return Math.max(max, set.size());
    }

  • @igorpistolyakaify
    @igorpistolyakaify 8 місяців тому

    Приветствую, во втором случае можно немного оптимизировать решение: предположим, что есть текущая уникальная подстрока и мы нашли следующий неуникальный символ, если размер "хвоста" меньше чем размер найденной подстроки, то можно прекратить поиск и вернуть результат. Очевидно, что выигрыш невелик, но все же.

  • @oArleo
    @oArleo 7 місяців тому

    Я бы построчным вводом добавлял , сортировал массив и сравнивал первую и вторую позиции и как только они равны записал бы размер массива-1, а потом начинал бы со второго символа.

  • @saasrus
    @saasrus 8 місяців тому +2

    А проверка того что буква уже в сете за проверку не считается и проходит мгновенно?

  • @kirill_monster
    @kirill_monster 8 місяців тому +1

    3:30 можно обойтись без флага используя такой синтаксис:
    for bla bla bla:
    print('Стоп')
    break
    else:
    print('Цикл завершен без остановки')

  • @SEIREIII
    @SEIREIII 8 місяців тому +1

    Нормально, 24 задание ЕГЭ, поехали

  • @michaelgolub2019
    @michaelgolub2019 8 місяців тому

    Первое, что пришло в голову, это то, что Вы назвали "метод скользящего окна". Я бы, наверное, это писал на компилируемом языке, если бы такое было позволено.

  • @jagorrim2371
    @jagorrim2371 8 місяців тому

    Было бы интересно послушать про работу различных структур данных

  • @leomysky
    @leomysky 8 місяців тому

    Спасибо за видео, всё понятно

  • @bertzaza
    @bertzaza 4 місяці тому

    Попалась такая на входных экзаменах на стажировку в тинек)

  • @sinushkin
    @sinushkin 2 місяці тому

    Вместо Set я бы использовал Map и хранил в значении индекс элемента который буду удалять, чтобы не пробегаться по циклу while

  • @ВладимирКалинин-и8т
    @ВладимирКалинин-и8т 8 місяців тому

    Это решение более эффективно, чем предложенное автором.
    class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
    d = {}
    i, j = 0, 0
    ans = 0
    while j

    • @SayXaNow
      @SayXaNow 8 місяців тому

      Эффективно только, если рассматривать с позиции лаконичности записи. У меня словарь тоже был первой идеей из-за возможности хранить индекс по ключу символа, но что-то меня смутило и в итоге быстро переделал через сет, почти 1 в 1 как у Саши с небольшой незначительной поправкой. Реализация со словарём конечно красива, и строчек кода на две меньше, ввиду отсутствия цикла удаления ненужных ключей, но перфоманс у неё хромает. Для лучшего случая по скорости на 20% хуже сета, в среднем в 2 раза медленнее, а для худшего случая решение со словарём медленнее почти в 4 раза. Это конечно все равно и тут, и там O(N), но такая разница немного удивила. Но не привыкать, в питоне не все то, что красивее выглядит, быстрее работает, зачастую как раз наоборот.

  • @yuriynicom
    @yuriynicom 8 місяців тому +1

    Без лишних слов, Превосходный контент и знания! СПАСИБО!!!! Вопрос: Английский вариант названия алгоритма "метод скользящего окна" ? The Sliding window ?

  • @sherumov6472
    @sherumov6472 8 місяців тому

    Отличное видео, спасибо

  • @Победа-ш1з
    @Победа-ш1з 8 місяців тому +3

    Изначально пришёл 2 вариант на ум, до первого даже догадаться не смог.
    По времени заняло минуты 2-3.

  • @БатырбекАйгалиев
    @БатырбекАйгалиев 8 місяців тому

    Очень крутое видео, спасибо!

  • @МихаилТихомиров-м8ч
    @МихаилТихомиров-м8ч 8 місяців тому +2

    Неплохое объяснение, но не оценивается вставка и поиск в Set, интервьювер разве не укажет на этот момент?

    • @emptyspaces4067
      @emptyspaces4067 8 місяців тому

      Уже несколько подобных комментов тут. Что вы так ополчились на сэты, что плохого они вам сделали?

    • @МихаилТихомиров-м8ч
      @МихаилТихомиров-м8ч 8 місяців тому

      @@emptyspaces4067 "мы" это разные люди, я за себя говорю, мне стало интересно, потому что это вопрос на засыпку.

    • @SayXaNow
      @SayXaNow 8 місяців тому

      @@МихаилТихомиров-м8ч принято считать что работа с сетом это константа. адепты лога будут негодовать, но на деле, чтобы сет постоянно уходил в лог - это надо нехило так постараться. плюс надо точно знать, а что под капотом у данной конкретной реализации сета, вдруг там реально обычное дерево, а не хэшмап. обычно совмещают оба два сразу. ну а в данной задачке, если символы ограничены - то можно реализовать свой собственный сет, который будет абсолютной константой, к которой уже невозможно будет придраться.

    • @МихаилТихомиров-м8ч
      @МихаилТихомиров-м8ч 8 місяців тому

      @@SayXaNow ну вообще джавовский hashset это как раз О(1), насчет пайтона я не знаю. Просто это может быть вопрос на засыпку от интервьювера, стоит об этом помнить.

    • @heybeachMIN
      @heybeachMIN 8 місяців тому

      @@МихаилТихомиров-м8ч у пайтона как я знаю тоже

  • @ДмитрийМилосердов-и7п
    @ДмитрийМилосердов-и7п 8 місяців тому

    Хочу поделиться своим решением, на момент ответа видео не досмотрел.
    Сравниваем элементы с помощью бинарного дерева.
    В цикле начинаем сравнивать , если элемент меньше идём в лево, если равно continue. Если след узел null то тогда записываем в дерево элемент и увеличиваем count ++.
    После цикла выводим count.
    У нас получится уникальное бинарное дерево, с счётчиком count.

    • @emptyspaces4067
      @emptyspaces4067 8 місяців тому

      Очень интересно, но ничего не понятно. Можно код, желательно на жабе или питоне?

  • @user-iu1jl3km
    @user-iu1jl3km 8 місяців тому

    Мне кажется что первый алгоритм выполняет не n в кубе операций , а (n+n*n) /2 так как right пробегает от i до n символа, где i - положение left; у второго алгоритма максимальная скорость O(n) , а минимальная O(n*n) потому что right точно пробежит один раз строку, а left может остаться в начале (если все символы разные) или пробежать все символы (если все символы одинаковы) P. S. Укажите если не прав

  • @kiminomeha
    @kiminomeha 8 місяців тому

    О да, это очень классный алгоритм. Его еще называют методом двух указателей. Все, кто к ЕГЭ по информатике готовится, учат его, довольно эффективный и гибкий алгоритм

  • @mrdastinol7007
    @mrdastinol7007 8 місяців тому +1

    Насколько я понимаю, удаление с начала масива очень долгое, потому что нужно создать другой масив и перекопировать все значения в него. Поэтому, когда у нас будет очень длинная подстрока, придётся много раз пересоздавать масив внутри сета.
    Лучше уж после каждой итерации поставить проверку (result < right - left + 1).
    Но может сет в Java работает не так как я думаю, надеюсь на отзыв.

    • @oleksandr2234
      @oleksandr2234 8 місяців тому

      Не пересоздается сет после удаления слева. Если не удалять - то не будет работать contains().

    • @mrdastinol7007
      @mrdastinol7007 8 місяців тому

      @@oleksandr2234 Спасибо за ответ!

  • @AlexanderSavchenko91
    @AlexanderSavchenko91 8 місяців тому

    спасибо интересный алгоритм!

  • @menceyh
    @menceyh 8 місяців тому

    Операции над set'ом же за ln(n) выполняются. Поэтому сложность с sliding window O(n*ln(n)), а без O(n^3 * ln(n))

    • @maximkutkov
      @maximkutkov 8 місяців тому

      он использовал unordered_set, где клюли хешируются за O(1)

  • @bobbob-rd7yz
    @bobbob-rd7yz 7 місяців тому

    можно просто 1 раз идти по масиву и добавлять колличество уникальних елементов до первого повоторения в новий масив, потом повторять подсчет с последнего уникального елемента, а потом просто взять наибольшое число нового масива.

  • @Ermorder1
    @Ermorder1 8 місяців тому +8

    Неплохое решение, но вот другое - за один проход, запоминая последний индекс символа. 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._ 8 місяців тому

      Попросил ИИ переписать на АХК скрипт +вернуть саму строку:
      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
      }

    • @CatBlack-p2h
      @CatBlack-p2h 8 місяців тому +1

      на 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 8 місяців тому

      С мапой очень плохое решение. Используется доп память. И не забывайте о том как растет мапа - это тоже далеко не бесплатно.

    • @heybeachMIN
      @heybeachMIN 8 місяців тому +1

      на питоне бы...

    • @Oldy573
      @Oldy573 6 місяців тому

      @@st.kevichочень плохое решение в видео и растет оно
      Символов у тебя фиксированное количество в отличие от букв

  • @Isamatdin
    @Isamatdin 5 місяців тому

    есть способ в котором только r будет один раз пройтись по строке, этот код работает за O(n), а не O(2n). Но это почти ничего не меняет.
    def solve(n,s):
    ans=0
    l,r=0,0
    hash_mp={}
    while r

  • @appngo6374
    @appngo6374 7 місяців тому

    Я на практике редко пользуюсь конструкцией while. В 1 проценте случаев)
    Можно еще решить вот так. Решение без скользящего окна.
    Хотя суть очень похожа.
    fun getMaxUniqueWithSet(input: String): Int {
    var maxSequence = 0
    val set = mutableSetOf()
    input.forEach { c ->
    if (set.contains(c)) {
    if (set.size > maxSequence) {
    maxSequence = set.size
    }
    set.clear()
    }
    set.add(c)
    }
    return max(maxSequence, set.size)
    }

  • @bzych8965
    @bzych8965 6 місяців тому

    а этот алгоритм разве не называется методом двух указателей?
    насколько я знаю из подготовки к егэ, скользящее окно -- это метод, при котором в какую-то сумму непрерывной подпоследовательности добавляется следующий элемент и вычитается из неё самый первый, так, экономно можно сдвигать интервал, в котором считается сумма, по массиву данных

  • @niklegaloff
    @niklegaloff 8 місяців тому +1

    остановил на 2:07 и мне показалось что первое очевидное решение на самом деле сложное и неочевдиным, очевидным решением для меня пробежаться по всем символам с хэшсетом накапливая его и фиксируя максимальный результат при наличии символа уже в нём, при этом сбрасывая его и возвращаясь назад на величину r-1, сча посмотри какое решение предложит автор

  • @JD-J1
    @JD-J1 7 місяців тому

    Объясните пожалуйста, почему последний пример на джава который, если заменить Set на List то не работает,выводит исключение вышли за границы листа

  • @ArtsiomShendzikau
    @ArtsiomShendzikau 8 місяців тому

    Спасибо за видео! Какие еще задачи можно решать методом скользящего окна?

  • @vasilekx8
    @vasilekx8 8 місяців тому

    Спасибо за видео!
    Немного запутанное объяснение либо такое ощущение, что какие-то кадры ошибочно вырезаны с видео. Либо плохо разобрался)

  • @АртемПотешкин-к6о
    @АртемПотешкин-к6о 8 місяців тому

    Привет! Было бы круто, если бы разобрал задачу Medium from two sorted arrays. Нигде не могу найти хорошого объяснения

  • @funny_sport_facts
    @funny_sport_facts 4 місяці тому

    @sashalukin, а почему это считается O(n) если в худшем случае понадобится в понадобится 2 раза полностью проходить по каждому символу строки? получается O(n^2)

    • @incios
      @incios 2 місяці тому

      -300 iq moment

  • @bigsky799
    @bigsky799 8 місяців тому +1

    зачем вычислять answer, когда можно вернуть размер сета в конце?

    • @AndroidsReview
      @AndroidsReview 8 місяців тому +2

      Потому что размер сета в конце может быть меньше максимального своего размера

  • @ArtsiomShendzikau
    @ArtsiomShendzikau 8 місяців тому

    Вы могли записать видео про метод двух указателей?

  • @Mikhail_Zaitsev
    @Mikhail_Zaitsev 7 місяців тому

    элементарный алгоритм и первое что приходит в голову. Ну а первый вариант очевидно отвергается сразу. Я удивлён простотой.

  • @alung414
    @alung414 7 місяців тому

    Интересно, что этот алгоритм начали спрашивать сейчас. Решал его еще года 3-4 на леткоде тогда он мне попался где-то 5 по счету. То что додумался до решения сам конечно тешет мое самолюбие. Но вот то что часа полтора два у меня ушло чтобы выдать рабочий код на go нет).

  • @nabamapo
    @nabamapo 8 місяців тому +1

    Спасибо за видео! А что это за софт со спойлерами и где можно рисовать?

  • @pythonForEvOne
    @pythonForEvOne 7 місяців тому

    подскажите что за приложение в котором вы стрелки по элементам так красиво двигали?

  • @arthur.v.babayan
    @arthur.v.babayan 8 місяців тому

    Интересно, конечно :)

  • @ДартРеван-ч7ь
    @ДартРеван-ч7ь 8 місяців тому

    Этот алгоритм напомнил мне метод указателей можно ли в данном случае его использовать?

  • @МаркХ-у9ь
    @МаркХ-у9ь 8 місяців тому

    Спасибо за видео! Можете пожалуйста посоветовать с чего начать изучение алгоритмов, если только только изучил основы python?

  • @furtherance6042
    @furtherance6042 8 місяців тому

    Прикольно. Лайк.
    Я только погружаюсь в программирование.
    Будет ли полезно в первом цикле (где увеличиваем подстроку) не прогонять её по минимальным значениям а сразу увеличить на Макс. Длинну, уже записанную в сет? Так мы пропустим (в данном примере) проверку сетов cb и db.

    • @rof3leo
      @rof3leo 8 місяців тому

      @furtherance6042 если я тебя правильно понял, то, если ты будешь пропускать символы, тогда сет не будет хранить все символы подстроки => ты можешь не понять, что случился повтор

  • @lesindorf-934videos
    @lesindorf-934videos 8 місяців тому

    Цифры Пифагора. Если у треугольника длины сторон 3, 4 и 5 метров, то он -- прямоугольный. Или 6, 8 и 10 метров. И т. д. Эти волшебные цифры позволяют на местности рисовать прямые углы. Размечать местность под фундамент, например.

  • @rasZam
    @rasZam 8 місяців тому

    спасибо, больше разборов задач. Не подскажете, что за второй монитор у вас?

  • @Hohmachik
    @Hohmachik 7 місяців тому

    Почему последний алгоритм работает за O(N)? Я не разбираюсь в подсчете продолжительности процессов и мне казалось, что добавление цикла увеличивает степень на 1, а тут как раз 2 цикла

  • @tonylayz
    @tonylayz 8 місяців тому +1

    1. Непонятно зачем использовать set если мы можем пройтись по уже существующей строке
    2. Удаление пока не пропадут все повторяющиеся символы? Если ты добавляешь 1 символ, то куда проще будет проверить повторяется ли этот символ и потом найти индекс первого вхождения и удалить все символы до него

    • @SayXaNow
      @SayXaNow 8 місяців тому

      Без сета ты улетишь в O(n*(n+1)/2) = O(n^2) по сложности для худшего случая.

    • @tonylayz
      @tonylayz 8 місяців тому

      @@SayXaNow там и так O(n^2) из-за while

    • @SayXaNow
      @SayXaNow 8 місяців тому +1

      @@tonylayz тот while выполнится не более N раз за всю работу кода, следовательно его плюсуют к N, а не умножают на N. А твой проход выполнятся будет в среднем N/2 за каждую итерацию внешнего цикла, поэтому его умножают на N.

  • @georgiken
    @georgiken 6 місяців тому +1

    тоже не самое быстрое решение, можно создать словарь, в котором будет храниться индекс последнего элемента, имеющего такое значение, что нынешний, на котором, находится правый указатель(по умолчанию поставим индекс -1, для проверки, либо множество опять же используем). Соответственно нам теперь не нужно постоянно перемещать левый указатель на 1, а мы сразу переместим его на нужный индекс, с которой начинается подходящая подстрока

    • @Oldy573
      @Oldy573 6 місяців тому

      Да, причем это грубейшая ошибка, которая приведет к эксепшену по памяти на огромных строках

    • @Oldy573
      @Oldy573 6 місяців тому

      Интересно, автор в команде оптимизации гугл хрома?

    • @georgiken
      @georgiken 6 місяців тому

      @@Oldy573 ахахаххаха

    • @georgiken
      @georgiken 6 місяців тому

      @@Oldy573 разве? в такой задаче максимальная длина у строки будет 256 или 128, не помню. Вот если взять какую-нибудь другую вариацию, то да, ошибка будет

  • @v.demchenko
    @v.demchenko 6 місяців тому

    Зачем второй цикл для указателя left?
    Мы и так попадаем в исключение которое говорит о том, что Set имеет данную букву и ёё нужно удалить.

  • @alexeidubrovin5234
    @alexeidubrovin5234 7 місяців тому

    но вы же второй при перемещении left тоже опять перебираете, не проще ли использовать std::map, хранить там позицию символа и сразу смещать позицию на искомый символ+1

  • @MichailLLevin
    @MichailLLevin 8 місяців тому

    а можно вместо set завести массив длинной в алфавит и держать в нем последний индекс, содержащий данную букву. Двигаем правый указатель, смотрим, была ли текущая буква в окне, если нет - запоминаем, идем дальше. Если буква была - стоп, проверяем, не больше ли текущее окно лучшего, если нашли лучшее - запоминаем окно и переставляем левый указатель сразу после буквы, которая повторилась.
    по сути - то же, но не надо двигать левый указатель по одному шагу, ну и обратиться к массиву - быстрее, чем добавлять-убирать из сета.

    • @jaggman2134
      @jaggman2134 8 місяців тому

      Первая мысль такая же была, только не с алфавитом, а в общем случае - хэшмапой

    • @rof3leo
      @rof3leo 8 місяців тому

      можно даже не индекс, а просто true, если встретилась и false, если нет. boolean меньше памяти занимает (хотя у тебя немного побыстрее работает). Потом в цикле проверяешь, если текущая буква уже встречалась, то двигаешь левый указатель, пока не уберешь предыдущее вхождение

    • @MichailLLevin
      @MichailLLevin 8 місяців тому

      @@rof3leo тогда придется на каждом шаге отбегать до начала текущей последовательности?

    • @MichailLLevin
      @MichailLLevin 8 місяців тому

      @@jaggman2134 честно говоря, у меня старая нелюбовь к хашмэпам, несколько раз сталкивался с тем, что сет на хэше работает в разы медленнее, чем обычный сет (вероятно на дереве). Если храним строки, получение хэша пробегает каждую строку до конца, а сравнение на < обычно кончается на первой же букве.

  • @VictorVedmich
    @VictorVedmich 7 місяців тому

    О а не подскажите через что вы делаете скрытие контента а потом его появление, по клику ?

  • @uasite
    @uasite 7 місяців тому +1

    Откуда у вас эти стрОку, подстрОку?
    Ведь строкА, а значит строкУ, а не стрОку?

  • @MrAsdimchik
    @MrAsdimchik 8 місяців тому

    Спасибо за видео.
    Какой инструмент используется для демонстрации ? Очень удобно отображать скрытый код при нажатии. Сам часто делаю тех презентации и такой инструмент очень бы сильно помог, а то ливкодинг глючит )))