Этот метод показывает, как вложенный цикл for в нескольких задачах может быть преобразован в одиночный цикл for, что снижает сложность времени.
Давайте начнем с задачи для иллюстрации, где мы можем применить эту технику —
Given an array of integers of size ‘n’. Our aim is to calculate the maximum sum of ‘k’ consecutive elements in the array. Input : arr[] = {100, 200, 300, 400} k = 2 Output : 700 Input : arr[] = {1, 4, 2, 10, 23, 3, 1, 0, 20} k = 4 Output : 39 We get maximum sum by adding subarray {4, 2, 10, 23} of size 4. Input : arr[] = {2, 3} k = 3 Output : Invalid There is no subarray of size 3 as size of whole array is 2.
Итак, давайте проанализируем проблему с помощью подхода грубой силы . Мы начинаем с первого индекса и суммируем до k-го элемента. Мы делаем это для всех возможных последовательных блоков или групп из k элементов. Этот метод требует вложенного цикла for, внешний цикл for начинается с начального элемента блока из k элементов, а внутренний или вложенный цикл будет складываться до k-го элемента.
Рассмотрим следующую реализацию:
|
Джава
|
python3
|
C #
|
PHP
|
Выход :
24
Из приведенного выше кода можно заметить, что сложность по времени составляет O (k * n), поскольку она содержит два вложенных цикла.
Техника скольжения окон
Технику лучше всего понять с оконным стеклом в шине, рассмотрим окно длиной n и фиксированное в нем окно длины k . Предположим, что изначально панель находится в крайнем левом углу, т.е. в 0 единицах слева. Теперь сопоставьте окно с массивом arr [] размера n и область с current_sum размером k элементов. Теперь, если мы применим силу к окну так, чтобы оно сдвигалось на единицу расстояния вперед. Панель будет охватывать следующие k последовательных элементов.
Рассмотрим массив arr [] = {5, 2, -1, 0, 3} и значение k = 3 и n = 5
Применение техники раздвижных окон :
- Мы вычисляем сумму первых k элементов из n членов, используя линейный цикл, и сохраняем сумму в переменной window_sum.
- Затем мы будем линейно пастись по массиву, пока он не достигнет конца, и одновременно будем отслеживать максимальную сумму.
- Чтобы получить текущую сумму блока из k элементов, просто вычтите первый элемент из предыдущего блока и добавьте последний элемент текущего блока.
Представленное ниже представление прояснит, как окно скользит по массиву.
Это начальная фаза, где мы вычислили начальную сумму окна, начиная с индекса 0. На данном этапе сумма окна равна 6. Теперь мы устанавливаем максимум_сумму текущим_окном, т.е. 6.

Теперь мы сдвигаем наше окно на единицу индекса. Следовательно, теперь он сбрасывает 5 из окна и добавляет 0 в окно. Следовательно, мы получим нашу новую сумму окна, вычтя 5 и затем добавив к нему 0. Итак, наша сумма окна теперь становится 1. Теперь мы сравним эту сумму окна с Maximum_sum. Поскольку оно меньше, мы не будем менять максимум_сумму.

Аналогично, теперь еще раз мы скользим нашим окном по индексу единицы и получаем новую сумму окна равной 2. Снова мы проверяем, больше ли эта текущая сумма окна, чем Maximum_sum до сих пор. Еще раз, это меньше, поэтому мы не меняем Maximum_sum.
Следовательно, для указанного выше массива наш максимум_сум равен 6.
код для приведенного выше описания:
|
Джава
|
python3
|
C #
|
PHP
|
Выход :
24
Теперь совершенно очевидно, что временная сложность линейна, поскольку мы видим, что в нашем коде выполняется только один цикл. Следовательно, наша временная сложность равна O (n) .
Мы можем использовать эту технику, чтобы найти max / min k-subarray, XOR, product, sum и т. Д. См. Проблемы со скользящим окном для таких задач.
Эта статья предоставлена Kanika Thakral . Если вы как GeeksforGeeks и хотели бы внести свой вклад, вы также можете написать статью с помощью contribute.geeksforgeeks.org или по почте статьи contribute@geeksforgeeks.org. Смотрите свою статью, появляющуюся на главной странице GeeksforGeeks, и помогите другим вундеркиндам.
Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.
Рекомендуемые посты:
- Максимум скользящего окна (максимум всех подмассивов размера k), используя стек за время O (n)
- Максимум скользящего окна (максимум всех подмассивов размера k)
- Максимально возможная сумма окна в массиве, чтобы элементы одного окна в другом массиве были уникальными
- Техника двух указателей
- Самое маленькое окно, которое содержит все символы самой строки
- Первое отрицательное целое число в каждом окне размера k
- Python | Рисование различных фигур в окне PyGame
- Подсчет различных элементов в каждом окне размера k
- Python | Отображать текст в окне PyGame
- Найти максимум минимума для каждого размера окна в данном массиве
- Кросс-браузерное изменение размера окна с использованием JavaScript / jQuery
- Найти наименьшее окно в строке, содержащей все символы другой строки
- Минимум K такой, что сумма элементов массива после деления на K не превышает S
- Наименьшее число, делящее минимальное количество элементов в массиве | Набор 2
0.00 (0%) 0 votes