Название Описание:
Учитывая массив чисел и размер скользящего окна 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
Идеи решения проблем:
В основном используйте очередь для сохранения максимального значения скользящего окна
шаг:
- Сначала определите, находится ли позиция главы команды в скользящем окне минус 3 от текущей позиции, если нет, удалите голову
- Сравните значение текущей позиции со значением всей очереди и удалите все значения в очереди, которые меньше текущей позиции (убедитесь, что очередь представляет собой монотонную очередь от большой до маленькой)
- Поставить в очередь значение текущей позиции
- Поместите начало очереди в массив и вернитесь к шагу 1.
Иллюстрация:
Первые два раза на рисунке не показаны,
- Позиция 0 в первой тренировке
- Во втором цикле позиция 1 больше, чем позиция 0, поэтому, когда оценивается шаг 2, позиция 1 находится вне очереди, а позиция 1 является заголовком очереди в это время и помещает ее в массив
- Позиция 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;
}
};