LeetCode #49 - Group Anagrams

Поделиться
HTML-код
  • Опубликовано: 8 июн 2024
  • В данном видео рассмотрен пример решения задачи №49 c сайта LeetCode (leetcode.com/problems/group-a...) на языке Java.
    Дружное сообщество:
    t.me/pse_club
    Материалы для разработчиков:
    proselyte.net/
    00:00:00 - Анализ задания
    00:01:30 - Анализ первого варианта решения
    00:02:33 - Реализация первого варианта решения
    00:06:28 - Оценка сложности первого варианта решения
    00:07:14 - Анализ второго варианта решения
    00:09:45 - Реализация второго варианта решения
    00:13:29 - Оценка сложности второго варианта решения

Комментарии • 31

  • @friedbearsburninhell2022
    @friedbearsburninhell2022 9 месяцев назад +1

    Я когда решаю, некоторые или похожие задачи на LeetCode, и после успешного решения, мне становиться доступен рейтинг "всех засабмичених решений" по скорости и памяти, я еще долго сижу и улыбаюсь просматривая код из обоих топов. Но, это для многих слишком =) Спасибо за труд, лайк в копилку!

    • @EugeneSuleimanov
      @EugeneSuleimanov  9 месяцев назад

      Спасибо за отзыв!
      Да, есть крайне интересные и сложные решения. Побитовые операции и динамическое программирование - это отдельный мир :)

  • @caffeinejavacode1475
    @caffeinejavacode1475 Месяц назад

    топ

  • @OJIeLLlka
    @OJIeLLlka 9 месяцев назад +1

    А что за процедура с вычетом чара 'a' и инкрементацией?

    • @EugeneSuleimanov
      @EugeneSuleimanov  9 месяцев назад

      Каждый символ char имеет последовательного цифровое значение. a - 97, b - 98 и т.д.

  • @andrey1266
    @andrey1266 9 месяцев назад

    А если у качестве ключа использовать сумму ASCII кодов символов строки и не сортировать ничего? Ведь а = 97, z = 122, они должны получиться уникальными вроде как.
    Если так, то осталось придумать, как незатратно посчитать сумму для charArray. Какой-нибудь mapToInt или просто приведением типов...

    • @EugeneSuleimanov
      @EugeneSuleimanov  9 месяцев назад +3

      Спасибо за комментарий!
      Если я верно понял идею, то тогда возможна коллизия, т.е. одна и та же сумма у разных ключей.

    • @andrey1266
      @andrey1266 9 месяцев назад

      ​ @EugeneSuleimanov а если hashCode() ?

    • @EugeneSuleimanov
      @EugeneSuleimanov  9 месяцев назад +2

      @@andrey1266 сохраняется вероятность коллизии.

    • @denisn6408
      @denisn6408 9 месяцев назад

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

    • @denisn6408
      @denisn6408 9 месяцев назад

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

  • @tiy2000
    @tiy2000 9 месяцев назад +1

    Так второе решение работает медленне. Или я чего не понял?)

    • @EugeneSuleimanov
      @EugeneSuleimanov  9 месяцев назад

      С точки зрения оценки сложности алгоритма - быстрее.

    • @SplashDmg2011
      @SplashDmg2011 9 месяцев назад

      Тоже это смутило. Решение лучше, а leetcode говорит, что оно медленнее работает и требует больше памяти)

    • @user-vx4xw5ml3e
      @user-vx4xw5ml3e 9 месяцев назад

      Можно засабмитить еще раз, у литкода каждый раз разные результаты по моим наблюдениям)

  • @denys_kovpaka
    @denys_kovpaka 9 месяцев назад +1

    Цікаве відео, дякую!!!
    Скільки Ви приділятєте часу в неділю на вирішення задач такого формату? і яку складность задач зазвичай обираєте?

    • @EugeneSuleimanov
      @EugeneSuleimanov  9 месяцев назад +1

      Дякую за відгук! Намагаюся щодня приділяти 2-2.5 години на дод. навчання. Чергую алго, системний дизайн, книги і т.д. Скільки саме йде рішення завдань не можу підказати точно. Розподіл: 40% easy, 40% medium, 20% hard.

    • @denys_kovpaka
      @denys_kovpaka 9 месяцев назад

      @@EugeneSuleimanov ого!!! Гарний темп

  • @ktotam8913
    @ktotam8913 9 месяцев назад

    Это и есть типа спортивное программирование? Кто как красивее типа таких задач решит?

    • @EugeneSuleimanov
      @EugeneSuleimanov  9 месяцев назад

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

  • @user-xg6so1kq3z
    @user-xg6so1kq3z 9 месяцев назад +1

    +

    • @EugeneSuleimanov
      @EugeneSuleimanov  9 месяцев назад +1

      Спасибо за комментарий!

  • @denisn6408
    @denisn6408 9 месяцев назад

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

    • @EugeneSuleimanov
      @EugeneSuleimanov  9 месяцев назад

      Передавать массив ключом - не рекомендуется как минимум по двум причинам:
      - мутабельность
      - сложности сравнения

    • @denisn6408
      @denisn6408 9 месяцев назад

      @@EugeneSuleimanov мы его и так мутируем, обнуляем на каждой итерации, просто уберем массив в класс реализуем и reset и сравнение и хэш, вроде в сравнении сложности никакой, внутри массива примитивы.

    • @EugeneSuleimanov
      @EugeneSuleimanov  9 месяцев назад

      @@denisn6408 String - иммутабелен

    • @denisn6408
      @denisn6408 9 месяцев назад

      @@EugeneSuleimanov но он лишний, можно сделать свой иммутабельный класс с массивом внутри и билдером для добавления символов, после того как символы добавлены по билду заодно материализуем и хэш

    • @EugeneSuleimanov
      @EugeneSuleimanov  9 месяцев назад

      @@denisn6408 можно сделать и класс, но какая тогда разница?

  • @LifePlot-lf4ve
    @LifePlot-lf4ve 9 месяцев назад

    Евгений, gpt чат использовали, или сами решали?

    • @EugeneSuleimanov
      @EugeneSuleimanov  9 месяцев назад

      Спасибо за вопрос!
      Без ChatGPT :)