最容易想到的是使用暴力的方法来做。
-
依次遍历所有的滑动窗口,扫描每个窗口中的所有数字并找出其中的最大值
-
如果滑动窗口的大小为k,那么需要O(k)的时间找最大值,对于长度为n大的数组,总的时间复杂度为O(nk)。
可以使用单调队列来进行优化。具体过程如下
-
新建一个双端队列,保存可能是窗口中最大值的元素。
-
比较划入窗口的值与队尾元素的值的大小,如果划入窗口的值大于队尾元素,队尾元素就不可能是窗口内的最大值了。因此队尾元素出队。
-
重复步骤2,直到对列为空或者队尾元素值大于等于划入窗口的值,此时划入窗口的值放入队列中。
-
然后看滑出窗口的值,如果滑出窗口的值等于队头元素,说明队头保存的值已经不在窗口内了,队头出队。
-
最后看窗口中的元素个数是不是等于k,如果等于k,则说明可以去除窗口中的最大值了,最大值就是对列的队头元素。
class Solution {
public:
vector<int> maxInWindows(vector<int>& nums, int k) {
if(k > nums.size()) return {};
deque<int> q;
vector<int> ans;
for(int i = 0; i < nums.size(); i++)
{
while(!q.empty() && q.back() < nums[i] ) q.pop_back();
q.push_back(nums[i]);
if(i - k >= 0 && nums[i - k] == q.front()) q.pop_front();
if(i >= k - 1)
ans.push_back(q.front());
}
return ans;
}
};