Пікірлер
@nikolaykarelin4565
@nikolaykarelin4565 Ай бұрын
Спасибо за разбор Одно замечание: при делении будет получаться float, и там можем быть не, например 4, а что-то вроде 3.999999999999999. Советую сравнивать сумму с k*threshold И еще лучше суммировать подмассивы через NumPy, хоть это не так правильно алгоритмически.
@idsulik
@idsulik Ай бұрын
В данной задаче это не важно было, поэтому опустил, а вот использовать NumPy вряд ли дадут на интервью, хочется сделать уроки, чтобы они были полезны на интервью. Спасибо за обратную связь!)
@nikolaykarelin4565
@nikolaykarelin4565 Ай бұрын
@@idsulik Про дробные числа в результатах деления было же в условиях.
@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
@nikolaykarelin4565 Ай бұрын
​@@idsulik меня вот этот комментарий ко второму примеру тригернул: Note that averages are not integers
@idsulik
@idsulik Ай бұрын
@@nikolaykarelin4565 threshold целое число, когда как среднее значение float, может на это намекают, но в данном примере даже если привести к int, все работает, хотя могло бы быть такое, что среднее вышло 4.6, а threshold был бы 5, то округлив мы получим 5, но если привести к int, то получим 4. Проверил, что в данной задаче и приведение и float работают одинаково)
@СтепанВоробьев-л2р
@СтепанВоробьев-л2р Ай бұрын
мужик, это очень годно продолжай))
@idsulik
@idsulik Ай бұрын
Спасибо👍
@KupriyanovKirill
@KupriyanovKirill 3 ай бұрын
Спасибо! хорошее видео. всё доступно и понятно объяснил.
@idsulik
@idsulik 3 ай бұрын
Спасибо большое!
@idsulik
@idsulik 3 ай бұрын
В каких случаях у LInkedList есть преимущество перед массивом: 1. Нужен FIFO или LIFO доступ к элементам. 2. Нужны частые операции добавляения большого количества элементов или объединения списков. 3. Список состоит из элементов большого размера, может содержать большое колличество элеметнов и при этом все время растет. Использование массивов тут неоптимально по причине часто реаллокации больших объёмов памяти. 4. Массив состоит из структур и по причине экономии ресурсов или необходимости обеспечения эффекивного многопоточного атомарного доступа нужно, чтобы элементы структур были сразу элементами списка (т.е. отказ от работы с указателями даёт какие-то преимущества). Крайне редкая ситуация. (c) habr.com/ru/articles/833624/comments/#comment_27125432
@just_bax
@just_bax 3 ай бұрын
Для второго решения лучше использовать set вместо dict
@idsulik
@idsulik 3 ай бұрын
Да можно, пример будет ниже, но можно еще лучше оптимизировать, вместо "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
@kocunys180
@kocunys180 3 ай бұрын
24 задание из ЕГЭ информатики
@idsulik
@idsulik 3 ай бұрын
Действительно похожее задание)
@chatoyluck4022
@chatoyluck4022 3 ай бұрын
спасибо большое автору
@idsulik
@idsulik 3 ай бұрын
спасибо)
@rimashi1089
@rimashi1089 3 ай бұрын
Как вариант, можно еще попробовать решить регулярками, это запаристо и знают единицы, но как вариант думаю сойдёт) спасибо за разборы
@idsulik
@idsulik 3 ай бұрын
Спасибо) Регулярками можно для разнообразия, но на собеседовании скорее всего будут ждать примерно такое решение, ну и на деле лучше тоже использовать такой вариант, т.к. регулярки тяжелее и добавляют когнитивную нагрузку, на мой взгляд
@rimashi1089
@rimashi1089 3 ай бұрын
@@idsulik полностью согласен, просто как вариант решения)
@vladimir_v_it
@vladimir_v_it 4 ай бұрын
Классная активность с решением алгоритмов! Продолжай в том же духе!
@idsulik
@idsulik 4 ай бұрын
Спасибо большое! Стараюсь
@anjelomanoranjan
@anjelomanoranjan 4 ай бұрын
на каком языке написана программа?
@idsulik
@idsulik 4 ай бұрын
если речь про задачу, то python
@skrillexpapa
@skrillexpapa 4 ай бұрын
ты просто лучший
@dmitrysapelnikov
@dmitrysapelnikov 6 ай бұрын
Мелкое улучшение: в результат сохранять не среднее, а максимальную сумму и делить на k уже на последней строке.
@idsulik
@idsulik 6 ай бұрын
да, можно и так
@nepicles
@nepicles 6 ай бұрын
ку, было бы круто увидеть разборы задач про деревья
@idsulik
@idsulik 6 ай бұрын
Спасибо! Будут разборы задач про деревья, графы и так далее, подбираю каждую задачу так, чтобы это было максимально полезно(задачи с канала либо попадутся на собеседовании, либо на их примере вы поймете подход, который поможет решить другие задачи, которые вам попадутся на собеседовании). Сейчас идут серии уроков связанные с методом two pointers, далее будет другой метод и т.д. Не хочется скакать с одной темы на другую.
@nepicles
@nepicles 6 ай бұрын
@@idsulik понял, спасибо
@staff6218
@staff6218 6 ай бұрын
Довольно кратко и понятно объясняешь, спасибо
@idsulik
@idsulik 6 ай бұрын
Спасибо большое!
@idsulik
@idsulik 6 ай бұрын
Вижу дизлайк на этом видео, был бы очень благодарен, если бы в комментах написали причину, чтобы у меня была возможность исправить или учесть это в будущем. Сам пересмотрел видео дважды, каких-либо ошибок не заметил, может причина в том, что толком не объяснил, почему у set сложность поиска данных O(1)?
@pacifica9373
@pacifica9373 6 ай бұрын
5:02 я понимаю почему в массиве нужно перебрать все N элементов. Но почему в set мы находим элемент за 1 операцию? Как это работает?
@idsulik
@idsulik 6 ай бұрын
Когда используем массив, чтобы найти элемент, нужно проверить каждый элемент по очереди, пока не найдем нужный. Это занимает в худшем случае N операций, где N - количество элементов в массиве. В отличие от массива, структура данных "множество" (set) обычно реализуется с помощью хеш-таблицы. В хеш-таблице каждое значение присваивается определенной "корзине" или "слоту" на основе его хеш-функции. Хеш-функция преобразует входные данные (значения, которые мы хотим хранить в множестве) в индекс массива, где эти значения будут храниться. Когда мы пытаемся проверить, существует ли элемент в множестве, мы можем просто: 1. Вычислить хеш от элемента. 2. Перейти непосредственно к корзине, которая соответствует хешу. 3. Проверить, содержит ли эта корзина искомый элемент. Этот процесс обычно занимает константное время, то есть O(1), потому что не зависит от количества элементов в множестве. Однако, в некоторых случаях (например, когда много элементов имеют один и тот же хеш), операция может занять больше времени, но это редкость при правильно выбранной хеш-функции и достаточной вместимости хеш-таблицы.
@idsulik
@idsulik 6 ай бұрын
если очень просто, то при добавлении значения в 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 очень важные структуры и без них никуда. постараюсь сделать отдельную серию видео на тему структур данных
@pacifica9373
@pacifica9373 6 ай бұрын
Спасибо) ​@@idsulik
@idsulik
@idsulik 7 ай бұрын
"Нужно вернуть индекс до которого все элементы уникальны" - наверно легче и правильнее было бы сказать, что нужно вернуть количество уникальных элементов, то есть делаем следующее: 1. Переносим все уникальные элементы в начало. 2. Возвращаем количество уникальных элементов.
@kelstar
@kelstar 7 ай бұрын
Задача сводится к тому чтобы класть возведенные в квадрат чила в стек пока не найдешь первое число больше нуля. После этого просто слияние двух отсортированных массивов. Двойной указатель тоже хорошо но можно запутаться в корнеркейсах и в целом если на собесе нелпозо показать что умешь юзать стек.
@idsulik
@idsulik 7 ай бұрын
Да, можно по разному решить. Если stack, то сложность по памяти будет O(n), с двумя указателями будет O(1)(НО только если не учитывать результирующий массив)
@kelstar
@kelstar 7 ай бұрын
@@idsulik ну если при перекладывании в стек освобождать ячейку исходного то типо тоже О(1) получится, ты по сути просто одну форму указателей в другую превращаешь
@idsulik
@idsulik 7 ай бұрын
@@kelstar нет, это не так, если я тебя правильно понял. В худшем случае у тебя все числа будут отрицательными и они все попадут на стек, а это O(n) сложность. В случае с указателями у тебя всегда определенное количество переменных и это количество не меняется в зависимости от входного массива, поэтому тут всегда будет сложность O(1)
@kelstar
@kelstar 7 ай бұрын
@@idsulik да, согласен всё-таки ты прав
@idsulik
@idsulik 7 ай бұрын
Сложность O(n) - имеется в виду, что итерируемся по всем элементам(или создаем массив из всех элементов), а все элементы - это m + n элементов. Точнее было бы сказать, что сложность не O(n), а O(m + n)
@pacifica9373
@pacifica9373 7 ай бұрын
Круто) Пожалуйста, продолжай снимать, я поставил колокольчик и решил что в перерывах между своими задачами буду смотреть твои видео
@idsulik
@idsulik 7 ай бұрын
Большое спасибо!)) Продолжу! Если есть какие-то замечания, что хотелось бы добавить/удалить/изменить, просьба писать об этом, нужен фидбек)
@jagorrim2371
@jagorrim2371 7 ай бұрын
Очень качественное объяснение интересной задачи, спасибо!
@idsulik
@idsulik 7 ай бұрын
Спасибо большое, очень приятно!
@muhycspb
@muhycspb 7 ай бұрын
а такой вариант не подойдет? nums = sorted(nums, key=lambda x: x==0)
@muhycspb
@muhycspb 7 ай бұрын
А, я прослушал условие.
@idsulik
@idsulik 7 ай бұрын
@@muhycspb да, такой вариант подойдет если нет ограничений) У такого варианта будет T: O(nlogn), когда как метод двух указателей даст T:O(n)
@AYakov
@AYakov 7 ай бұрын
Все хорошо, но было бы круто еще говорить про сложности алгоритмов
@idsulik
@idsulik 7 ай бұрын
Спасибо! Имеется в виду рассказать, что значит та или иная сложность? Потому что саму сложность для конкретных решений я пишу и говорю из-за чего такая сложность(к примеру, O(nlogn) потому что используем сортировку). Если речь про отдельное видео про сложность, то да, сделаю и такое видео
@AYakov
@AYakov 7 ай бұрын
@@idsulik Не, наверное, про то, когда ты пишешь в конце код, чтоб говорить про сложность еще раз :) Я просто например пролистнул сразу к решению и обычно в конце рассказывают какая сложность и т.д.(ожидал того же). Тем более по коду ты можешь еще раз объяснить почему это такая сложность и т.д. от кол-ва циклов и кол-во за использованной памяти
@idsulik
@idsulik 7 ай бұрын
@@AYakov отличное предложение, согласен, что это будет полезно. Со следующего видео начну так делать. Спасибо!)
@vova_dev
@vova_dev 7 ай бұрын
Классно! Делай ещё!
@idsulik
@idsulik 7 ай бұрын
Спасибо большое!
@faangtalk
@faangtalk 7 ай бұрын
отличный разбор! Удачи с каналом!
@idsulik
@idsulik 7 ай бұрын
Спасибо большое!