给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值。
思路:
使用一个双端队列window,保持window里的值从队首到队尾是从大到小的。每次取window的队首元素为窗口里的最大值。新元素入队时,判断队尾元素是否比新元素小,如果小,则队尾元素出队,否则新元素入队。取最大值时,要确保队首元素都在窗口里,如果不在,则让其出队。然后再拿队首元素当最大值。
代码:
class Solution {
public:
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
deque<int> window;
for(int i = 0;i < k;i++) {
while(!window.empty() && nums[window.back()] <= nums[i]) {
window.pop_back();
}
window.push_back(i);
}
vector<int> ans;
ans.push_back(nums[window.front()]);
int len = nums.size();
for(int i = k;i < len;i++) {
while(!window.empty() && nums[window.back()] <= nums[i]) {
window.pop_back();
}
window.push_back(i);
while(window.front() <= i-k) {
window.pop_front();
}
ans.push_back(nums[window.front()]);
}
return ans;
}
};