1. 運用滑動窗口模板解題, 具體可以看滑動窗口總結這篇.
2. 但是我們需要注意每次類似維護一個單調遞減棧,這樣front就是最大值,然後移除之後,下一個就是下一個窗口的最大值.
3. 遇到大於back值的,就循環將最大值移動到相應的位置, 這裏用雙端隊列deque實現這個功能.
class Solution {
public:
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
vector<int> res;
//邊界條件
if(nums.size()==0 || k<1 || nums.size()<k) return res;
int left=0, right=0;
deque<int> tmp;
//先移動右指針.
while(right<nums.size()) {
//循環移動最大值到最前面.
while(!tmp.empty() && nums[right]>tmp.back()) {
tmp.pop_back();
}
tmp.push_back(nums[right]);
right++;
//窗口大小符合要求.
while(right-left==k) {
res.push_back(tmp.front());
if(nums[left]==tmp.front()) tmp.pop_front();
left++;
}
}
return res;
}
};