Спасибо за разбор Одно замечание: при делении будет получаться float, и там можем быть не, например 4, а что-то вроде 3.999999999999999. Советую сравнивать сумму с k*threshold И еще лучше суммировать подмассивы через NumPy, хоть это не так правильно алгоритмически.
@idsulikАй бұрын
В данной задаче это не важно было, поэтому опустил, а вот использовать NumPy вряд ли дадут на интервью, хочется сделать уроки, чтобы они были полезны на интервью. Спасибо за обратную связь!)
@nikolaykarelin4565Ай бұрын
@@idsulik Про дробные числа в результатах деления было же в условиях.
@idsulikАй бұрын
@@nikolaykarelin4565 Где? Given an array of integers arr and two integers k and threshold, return the number of sub-arrays of size k and average greater than or equal to threshold. Constraints: 1 <= arr.length <= 105 1 <= arr[i] <= 104 1 <= k <= arr.length 0 <= threshold <= 104
@nikolaykarelin4565Ай бұрын
@@idsulik меня вот этот комментарий ко второму примеру тригернул: Note that averages are not integers
@idsulikАй бұрын
@@nikolaykarelin4565 threshold целое число, когда как среднее значение float, может на это намекают, но в данном примере даже если привести к int, все работает, хотя могло бы быть такое, что среднее вышло 4.6, а threshold был бы 5, то округлив мы получим 5, но если привести к int, то получим 4. Проверил, что в данной задаче и приведение и float работают одинаково)
@СтепанВоробьев-л2рАй бұрын
мужик, это очень годно продолжай))
@idsulikАй бұрын
Спасибо👍
@KupriyanovKirill3 ай бұрын
Спасибо! хорошее видео. всё доступно и понятно объяснил.
@idsulik3 ай бұрын
Спасибо большое!
@idsulik3 ай бұрын
В каких случаях у LInkedList есть преимущество перед массивом: 1. Нужен FIFO или LIFO доступ к элементам. 2. Нужны частые операции добавляения большого количества элементов или объединения списков. 3. Список состоит из элементов большого размера, может содержать большое колличество элеметнов и при этом все время растет. Использование массивов тут неоптимально по причине часто реаллокации больших объёмов памяти. 4. Массив состоит из структур и по причине экономии ресурсов или необходимости обеспечения эффекивного многопоточного атомарного доступа нужно, чтобы элементы структур были сразу элементами списка (т.е. отказ от работы с указателями даёт какие-то преимущества). Крайне редкая ситуация. (c) habr.com/ru/articles/833624/comments/#comment_27125432
@just_bax3 ай бұрын
Для второго решения лучше использовать set вместо dict
@idsulik3 ай бұрын
Да можно, пример будет ниже, но можно еще лучше оптимизировать, вместо "while" использовать "if", если знаете как, то напишите, если нет, но хотите узнать, дайте знать) class Solution: def lengthOfLongestSubstring(self, s: str) -> int: res = 0 left = 0 seen = set() for right in range(len(s)): right_char = s[right] while right_char in seen: left_char = s[left] seen.remove(left_char) left += 1 seen.add(right_char) res = max(res, right - left + 1) return res
@kocunys1803 ай бұрын
24 задание из ЕГЭ информатики
@idsulik3 ай бұрын
Действительно похожее задание)
@chatoyluck40223 ай бұрын
спасибо большое автору
@idsulik3 ай бұрын
спасибо)
@rimashi10893 ай бұрын
Как вариант, можно еще попробовать решить регулярками, это запаристо и знают единицы, но как вариант думаю сойдёт) спасибо за разборы
@idsulik3 ай бұрын
Спасибо) Регулярками можно для разнообразия, но на собеседовании скорее всего будут ждать примерно такое решение, ну и на деле лучше тоже использовать такой вариант, т.к. регулярки тяжелее и добавляют когнитивную нагрузку, на мой взгляд
@rimashi10893 ай бұрын
@@idsulik полностью согласен, просто как вариант решения)
@vladimir_v_it4 ай бұрын
Классная активность с решением алгоритмов! Продолжай в том же духе!
@idsulik4 ай бұрын
Спасибо большое! Стараюсь
@anjelomanoranjan4 ай бұрын
на каком языке написана программа?
@idsulik4 ай бұрын
если речь про задачу, то python
@skrillexpapa4 ай бұрын
ты просто лучший
@dmitrysapelnikov6 ай бұрын
Мелкое улучшение: в результат сохранять не среднее, а максимальную сумму и делить на k уже на последней строке.
@idsulik6 ай бұрын
да, можно и так
@nepicles6 ай бұрын
ку, было бы круто увидеть разборы задач про деревья
@idsulik6 ай бұрын
Спасибо! Будут разборы задач про деревья, графы и так далее, подбираю каждую задачу так, чтобы это было максимально полезно(задачи с канала либо попадутся на собеседовании, либо на их примере вы поймете подход, который поможет решить другие задачи, которые вам попадутся на собеседовании). Сейчас идут серии уроков связанные с методом two pointers, далее будет другой метод и т.д. Не хочется скакать с одной темы на другую.
@nepicles6 ай бұрын
@@idsulik понял, спасибо
@staff62186 ай бұрын
Довольно кратко и понятно объясняешь, спасибо
@idsulik6 ай бұрын
Спасибо большое!
@idsulik6 ай бұрын
Вижу дизлайк на этом видео, был бы очень благодарен, если бы в комментах написали причину, чтобы у меня была возможность исправить или учесть это в будущем. Сам пересмотрел видео дважды, каких-либо ошибок не заметил, может причина в том, что толком не объяснил, почему у set сложность поиска данных O(1)?
@pacifica93736 ай бұрын
5:02 я понимаю почему в массиве нужно перебрать все N элементов. Но почему в set мы находим элемент за 1 операцию? Как это работает?
@idsulik6 ай бұрын
Когда используем массив, чтобы найти элемент, нужно проверить каждый элемент по очереди, пока не найдем нужный. Это занимает в худшем случае N операций, где N - количество элементов в массиве. В отличие от массива, структура данных "множество" (set) обычно реализуется с помощью хеш-таблицы. В хеш-таблице каждое значение присваивается определенной "корзине" или "слоту" на основе его хеш-функции. Хеш-функция преобразует входные данные (значения, которые мы хотим хранить в множестве) в индекс массива, где эти значения будут храниться. Когда мы пытаемся проверить, существует ли элемент в множестве, мы можем просто: 1. Вычислить хеш от элемента. 2. Перейти непосредственно к корзине, которая соответствует хешу. 3. Проверить, содержит ли эта корзина искомый элемент. Этот процесс обычно занимает константное время, то есть O(1), потому что не зависит от количества элементов в множестве. Однако, в некоторых случаях (например, когда много элементов имеют один и тот же хеш), операция может занять больше времени, но это редкость при правильно выбранной хеш-функции и достаточной вместимости хеш-таблицы.
@idsulik6 ай бұрын
если очень просто, то при добавлении значения в set, это значение проходит через функцию, которая выдает индекс, где можно найти этот элемент. hash('мое какое-то значение') -> 100500 #вызвали функцию хеширования значения, на выходе получили индекс, далее уже находим этот элемент по индексу. это упрощенный вариант, рекомендую посмотреть пару видео на эту тему kzbin.info?search_query=%D1%85%D0%B5%D1%88+%D1%82%D0%B0%D0%B1%D0%BB%D0%B8%D1%86%D0%B0, чтобы точно понять как это работает, потому что set/map очень важные структуры и без них никуда. постараюсь сделать отдельную серию видео на тему структур данных
@pacifica93736 ай бұрын
Спасибо) @@idsulik
@idsulik7 ай бұрын
"Нужно вернуть индекс до которого все элементы уникальны" - наверно легче и правильнее было бы сказать, что нужно вернуть количество уникальных элементов, то есть делаем следующее: 1. Переносим все уникальные элементы в начало. 2. Возвращаем количество уникальных элементов.
@kelstar7 ай бұрын
Задача сводится к тому чтобы класть возведенные в квадрат чила в стек пока не найдешь первое число больше нуля. После этого просто слияние двух отсортированных массивов. Двойной указатель тоже хорошо но можно запутаться в корнеркейсах и в целом если на собесе нелпозо показать что умешь юзать стек.
@idsulik7 ай бұрын
Да, можно по разному решить. Если stack, то сложность по памяти будет O(n), с двумя указателями будет O(1)(НО только если не учитывать результирующий массив)
@kelstar7 ай бұрын
@@idsulik ну если при перекладывании в стек освобождать ячейку исходного то типо тоже О(1) получится, ты по сути просто одну форму указателей в другую превращаешь
@idsulik7 ай бұрын
@@kelstar нет, это не так, если я тебя правильно понял. В худшем случае у тебя все числа будут отрицательными и они все попадут на стек, а это O(n) сложность. В случае с указателями у тебя всегда определенное количество переменных и это количество не меняется в зависимости от входного массива, поэтому тут всегда будет сложность O(1)
@kelstar7 ай бұрын
@@idsulik да, согласен всё-таки ты прав
@idsulik7 ай бұрын
Сложность O(n) - имеется в виду, что итерируемся по всем элементам(или создаем массив из всех элементов), а все элементы - это m + n элементов. Точнее было бы сказать, что сложность не O(n), а O(m + n)
@pacifica93737 ай бұрын
Круто) Пожалуйста, продолжай снимать, я поставил колокольчик и решил что в перерывах между своими задачами буду смотреть твои видео
@idsulik7 ай бұрын
Большое спасибо!)) Продолжу! Если есть какие-то замечания, что хотелось бы добавить/удалить/изменить, просьба писать об этом, нужен фидбек)
@jagorrim23717 ай бұрын
Очень качественное объяснение интересной задачи, спасибо!
@idsulik7 ай бұрын
Спасибо большое, очень приятно!
@muhycspb7 ай бұрын
а такой вариант не подойдет? nums = sorted(nums, key=lambda x: x==0)
@muhycspb7 ай бұрын
А, я прослушал условие.
@idsulik7 ай бұрын
@@muhycspb да, такой вариант подойдет если нет ограничений) У такого варианта будет T: O(nlogn), когда как метод двух указателей даст T:O(n)
@AYakov7 ай бұрын
Все хорошо, но было бы круто еще говорить про сложности алгоритмов
@idsulik7 ай бұрын
Спасибо! Имеется в виду рассказать, что значит та или иная сложность? Потому что саму сложность для конкретных решений я пишу и говорю из-за чего такая сложность(к примеру, O(nlogn) потому что используем сортировку). Если речь про отдельное видео про сложность, то да, сделаю и такое видео
@AYakov7 ай бұрын
@@idsulik Не, наверное, про то, когда ты пишешь в конце код, чтоб говорить про сложность еще раз :) Я просто например пролистнул сразу к решению и обычно в конце рассказывают какая сложность и т.д.(ожидал того же). Тем более по коду ты можешь еще раз объяснить почему это такая сложность и т.д. от кол-ва циклов и кол-во за использованной памяти
@idsulik7 ай бұрын
@@AYakov отличное предложение, согласен, что это будет полезно. Со следующего видео начну так делать. Спасибо!)