Серия предложений Sword Finger Предложение Finger Finger 59-I: Максимальное скользящее окно

Название Описание:

Учитывая массив чисел и размер скользящего окна k, найдите максимальное значение среди всех скользящих окон.

Пример:

Ввод: nums = [1,3, -1, -3,5,3,6,7] и k = 3
Выход: [3,3,5,5,6,7] 
Пояснение: 

  Положение скользящего окна Максимальное значение
--------------- -----
[1 3 -1] -3 5 3 6 7 3
 1 [3 -1 -3] 5 3 6 7 3
 1 3 [-1 -3 5] 3 6 7 5
 1 3 -1 [-3 5 3] 6 7 5
 1 3 -1 -3 [5 3 6] 7 6
 1 3 -1 -3 5 [3 6 7] 7

Идеи решения проблем:

В основном используйте очередь для сохранения максимального значения скользящего окна

шаг:

  1. Сначала определите, находится ли позиция главы команды в скользящем окне минус 3 от текущей позиции, если нет, удалите голову
  2. Сравните значение текущей позиции со значением всей очереди и удалите все значения в очереди, которые меньше текущей позиции (убедитесь, что очередь представляет собой монотонную очередь от большой до маленькой)
  3. Поставить в очередь значение текущей позиции
  4. Поместите начало очереди в массив и вернитесь к шагу 1.

Иллюстрация:

Первые два раза на рисунке не показаны,

  1. Позиция 0 в первой тренировке
  2. Во втором цикле позиция 1 больше, чем позиция 0, поэтому, когда оценивается шаг 2, позиция 1 находится вне очереди, а позиция 1 является заголовком очереди в это время и помещает ее в массив
  3. Позиция 2 меньше позиции 1, поэтому позиция 2 добавляется в очередь; позиция 1 в начале очереди помещается в массив.

Код:

class Solution {
public:
    vector<int> maxSlidingWindow(vector<int>& num, int k) {
        vector<int> res;   //存储所有滑动窗口里数值的最大值
        deque<int> q;   //存储滑动窗口里的数据
        for(int i=0;i<num.size();i++)
        {
            //滑动窗口满时,则队头出队列
            while(!q.empty() && i-q.front() >= k)
            {
                q.pop_front();
            }
            //维持队列的单调性
            while(!q.empty() && num[i]>=num[q.back()])
            {
                q.pop_back();
            }
            q.push_back(i);
            if(i>=k-1)
            {
                res.push_back(num[q.front()]);
            }
        }
        return res;
    }
};

 

рекомендация

отblog.csdn.net/qq_46423166/article/details/111190709
рекомендация