解题思路:
分类讨论
用max_val维护前一个滑动窗口的最大值;
res存放每个窗口的最大值;
首先要计算第一个窗口的最大值,记录max_val;
往后滑动一个,删除了一个最左边元素,以及增加了一个最右侧元素。
情况1 最右侧元素,大于等于上一个窗口的max_val,那么毫无疑问,这个窗口的最大值就是最右侧元素,更新max_val;
情况2 最右侧元素,小于上一个窗口的max_val;
那么就看删除的那个元素,假如删除的那个左侧元素等于max_val,那么就要重新计算最大值max_val,注意,此时要更新max_val为INT_MIN;
假如删除的左侧元素小于max_val,那么就不用看了,最大元素就是max_val了。
class Solution {
public:
vector<int> maxInWindows(const vector<int>& num, unsigned int size) {
vector<int>res;
int n=num.size();
if(size==0||size>n)
return res;
int left=0,offset=size-1;
int max_val=INT_MIN;
for(int i=0;i<=offset;++i){
if(num[i]>max_val)
max_val=num[i];
}
res.push_back(max_val);
for(int i=1;i+offset<n;++i){
if(num[i+offset]>=max_val){
max_val=num[i+offset];
}else{
//右侧新加入的<max_val
//那么就看左侧移除元素的是==max_val,是的话重新计算最大值max_val,小于max_val就max_val不变
if(num[i-1]==max_val){
max_val=INT_MIN;
for(int j=i;j<=i+offset;++j){
if(num[j]>max_val)
max_val=num[j];
}
}
}
res.push_back(max_val);
}
return res;
}
};