Skip to content

MarshalX/competitive-programming

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Competitive Programming WakaTime

Я просто хочу пройти алгоритмический собес 🥺

Тут будут какие-то заметки, когда я столкнусь с чем-то сложным/интересным/новым для себя.

Кроме этого сформирую базу ссылок того что читал/смотрел/изучал.

На текущий момент основная платформа LeetCode.

Алгоритмы

  • KMP — поиск подстроки в строке за O(m + n). Встретился в 28. Брутфорс ушёл в TL. Алгос списал с псевдокода на вики: Knuth–Morris–Pratt algorithm.
  • Prefix sumбыстрый ответ на множество вопросов "Какая сумма на подмассиве от L до R?" (pref[0] = a[0]; pref[i] = pref[i - 1] + a[i]. Q: pref[r] - pref[l - 1] или pref[r] если l == 0). Точ в точ задача 303. Интересное и легкое усложнение задачи в 724.
  • Kadane's algorithm — подмассив с наибольшей суммой (tSum += a[i]; tSum = max(tSum, a[i]); res = max(res, tSum)).

Заметки

  • В 1408 допустил ошибку при оценке временной сложности. Там не O(N^2*L), а O(N*L), где L сумма длин всех строк. Потому что несмотря на вложенный цикл мы выполняем поиск в строке за длину строку, а циклы порождают сравнение строки с каждой другой. Где каждую другую можно заменить на сумму длин всех строк (L). Поэтому оценка количество строк умноженное на сумму длин (N*L). Что меньше моей изначальной оценки, так как в условии задачи максимальная длинна строк 30, а количество слов 100.
  • Долго мучался с 11 (бассейн с двумя бортиками). Брутфорс конечно не зашёл, прочитал подсказки, частично дорешал, не справившись отловить баг пошёл в обсуждения к задаче. Посмотря на чужой код понял, что нафантазировал ненужные дополнительные условия (diff). В итоге списал с чужого кода, но свою ошибку понял (кажется). Upd. 121 задача мне сильно напомнила эту.
  • В 1337 первый раз использовал кучу. В условии задачи условия повторяют сравнение пары интов. Если первые элементы (сила строки AKA кол-во единиц в ней) равны, то сравниваем вторые (индекс в массиве по задаче). Так как по условию нам нужно вывести слабейших, то используем кучу для поиска минимума (std::priority_queue<T, vector<T>, greater<T>>).
  • В 231 сраные граничные случаи с -2^31 и 2^31-1.

Ссылки на почитать

Сайты с темами

Конкретные темы

Ссылки на посмотреть