Time: O(n)
Space: O(n)
k = (i - nums[i] + 1 + n) % n, а затем уменьшаем diff[k] на 1, чтобы учесть, что при таком сдвиге баллы уменьшаются❔ Почему k вычисляется именно так?▫ i: исходная позиция элемента▫ - nums[i]: смещаемся назад настолько, насколько велик сам элемент▫ + 1: смещаемся еще на одну позицию, чтобы теперь элемент не давал баллы▫ + n: гарантируем, что выражение не будет отрицательным▫ % n: берем по модулю, чтобы остаться в пределах массива❔ Почему изменения для каждого сдвига суммируются?➖ вычисляя k, мы определяем самую правую позицию, в которой данный элемент не приносит баллы, соответственно при большем сдвиге он сдвигается левее, где также не будет приносить баллы, поэтому мы последовательно суммируем изменения для каждого сдвига. При этом мы учитываем, что массив цикличный, на каждом шаге добавляя в cur +1 для элемента, который перешел в конец массива
Please open Telegram to view this post
VIEW IN TELEGRAM
Представим, что ты следишь за своими расходами и всегда хочешь знать, сколько денег ты потратил за последние 7 дней.
Вместо того, чтобы каждый день пересчитывать все с нуля, ты хранишь текущую сумму за последние 7 дней, каждый день добавляешь новую трату и вычитаешь трату, которая была 8 дней назад.
Таким образом, у тебя всегда актуальная сумма за последние 7 дней без необходимости считать ее всю постоянно.
#slidingwindow
Please open Telegram to view this post
VIEW IN TELEGRAM
1652. Defuse the Bomb
Company:
Необходимо заменить каждый элемент по следующим правилам:
Массив code является круговым, поэтому следующим элементом code[n-1] является code[0], а предыдущим элементом code[0] является code[n-1].
Верните полученный массив
#leetcode1652 | #easy #slidingwindow
Please open Telegram to view this post
VIEW IN TELEGRAM
Time: O(n)
Space: O(n)
▫ из текущей суммы вычитаем элемент на позиции старта окна (start % n) и добавляем элемент следующий после конца ((end + 1) % n), то есть считаем сумму для следующего окна, меняя только границы, при этом все содержимое между остается неизменным, поэтому мы получаем ее правильно▫ затем увеличиваем указатели start и end, фактически передвигая окно на следующую позицию
Please open Telegram to view this post
VIEW IN TELEGRAM
2379. Minimum Recolors to Get K Consecutive Black Blocks
Company:
За одну операцию вы можете перекрасить белый блок в черный.
Верните минимальное количество операций, необходимое для того, чтобы было хотя бы одно вхождение последовательных k черных блоков
#leetcode2379 | #easy #slidingwindow
Please open Telegram to view this post
VIEW IN TELEGRAM
Time: O(n)
Space: O(1)
Please open Telegram to view this post
VIEW IN TELEGRAM
2516. Take K of Each Character From Left and Right
Company:
Верните минимальное количество минут, необходимое для того, чтобы взять не меньше k каждого символа или -1, если это невозможно
#leetcode2516 | #medium #slidingwindow
Please open Telegram to view this post
VIEW IN TELEGRAM
Time: O(n)
Space: O(1)
🟦 для решения будем искать самое большое окно из символов такое, что в оставшейся части строки (слева и справа) будут символы, которые удовлетворяют условию по количеству, а затем вычтем его из длины строки
Please open Telegram to view this post
VIEW IN TELEGRAM
2461. Maximum Sum of Distinct Subarrays With Length K
Company:
Найдите максимальную сумму подмассива длиной k, в котором все элементы различны
#leetcode2461 | #medium #slidingwindow
Please open Telegram to view this post
VIEW IN TELEGRAM
Time: O(n)
Space: O(n)
Please open Telegram to view this post
VIEW IN TELEGRAM
2134. Minimum Swaps to Group All 1's Together II
Company:
#leetcode2134 | #medium #slidingwindow
Please open Telegram to view this post
VIEW IN TELEGRAM
Time: O(n)
Space: O(1)
🟦 поскольку сгруппировать единицы можно в любом месте, нужно найти такое окно размером общего количества единиц, в котором будет меньше всего позиций для перестановок, то есть нулей
Please open Telegram to view this post
VIEW IN TELEGRAM
1234. Replace the Substring for Balanced String
Company:
Строка называется сбалансированной, если каждый из ее символов появляется n / 4 раз, где n — длина строки, всегда кратная 4.
Верните минимальную длину подстроки, которую можно заменить любой другой строкой той же длины, чтобы сделать всю строку s сбалансированной
#leetcode1234 | #medium #slidingwindow
Please open Telegram to view this post
VIEW IN TELEGRAM
Time: O(n)
Space: O(1)
private boolean isBalanced(int[] freq, int target) {
for (int num : freq) {
if (num > target) {
return false;
}
}
return true;
}
Please open Telegram to view this post
VIEW IN TELEGRAM
904. Fruit Into Baskets
Company:
Начиная с любой позиции, двигайтесь вправо, собирая фрукты, пока они помещаются в ваши корзины. Верните максимальное количество фруктов, которое можно собрать
#leetcode904 | #medium #slidingwindow
Please open Telegram to view this post
VIEW IN TELEGRAM
Time: O(n)
Space: O(k)
пока это условие верно, передвигаем левый указатель, уменьшая частоту элементов под ним, и удаляем элемент из HashMap, если его частота стала равна 0
Please open Telegram to view this post
VIEW IN TELEGRAM
2009. Minimum Number of Operations to Make Array Continuous
Company:
Массив считается непрерывным, если выполняются оба следующих условия:
Верните минимальное количество операций, необходимое для создания непрерывного массива
#leetcode2009 | #hard #slidingwindow
Please open Telegram to view this post
VIEW IN TELEGRAM
Time: O(nlogn)
Space: O(n)
🟦 для решения найдем максимальное окно (подмассив), в котором все элементы уникальны и максимальный элемент не превышает минимальный плюс длина исходного массива.
При этом нам не нужно думать, как заменить оставшиеся элементы, так как необходимо вывести только количество операций. Также нам не важен порядок элементов, а только минимальный и максимальный, поэтому их можно отсортировать для удобного поиска
Please open Telegram to view this post
VIEW IN TELEGRAM
30. Substring with Concatenation of All Words
Company:
Сцепленная строка — это строка, которая содержит в точности все строки любой перестановки words.
Верните список начальных индексов всех сцепленных подстрок в s
#leetcode30 | #hard #slidingwindow
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Time: O(k + n*m)
Space: O(k + m)
🟦 в начале инициализируем все необходимые глобальные переменные для удобного доступа: длина строки, длина одного слова, количество всех слов и размер окна, как умножение кол-ва всех слов на длину одного. Также формируем HashMap частоты слов из words🟦 после используем функцию slidingWindow для всех стартовых позиций от 0 до длины одного слова, так как дальше все позиции будут повторяться и не нужно их снова рассматривать
🟦 внутри этой функции мы идём по строке с шагом wordLen, каждый раз формируя новые слова, ведя их учёт в HashMap (wordsFound) и считая их количество (wordsCount) или обозначая, что оно лишнее (excessWord)🟦 рассматриваем две ситуации:
1. Если текущее слово не из wordsMap: сбрасываем все счётчики и начинаем окно заново
2. Иначе:➖ если достигнут допустимый размер окна или есть лишнее слово, сужаем окно с левой стороны, убирая слова из wordsFound и корректируя переменные➖ добавляем текущее слово в wordsFound➖ если оно встречается чаще, чем в wordsMap, выставляем флаг excessWord = true (лишнее слово)➖ если все нужные слова найдены и нет лишнего — добавляем левую границу окна в результат
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM