剑指offer编程题—滑动窗口的最大值
2020-03-15 本文已影响0人
零岁的我
题目描述
给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5}; 针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个: {[2,3,4],2,6,2,5,1}, {2,[3,4,2],6,2,5,1}, {2,3,[4,2,6],2,5,1}, {2,3,4,[2,6,2],5,1}, {2,3,4,2,[6,2,5],1}, {2,3,4,2,6,[2,5,1]}。
解题思路
定义三个指针(数组新的下标)i,j,t,保持i指向当前滑动窗口的最后一个元素;j指向上一个滑动窗口内的最大值,当j同时也在当前滑动窗口内时,j指向的元素也是当前滑动窗口的最大值;当j指向的最大元素不在当前滑动窗口内时,借助指针t(相当于回退i指针)从j指向位置的前一个位置开始更新最大元素。
class Solution {
public:
vector<int> maxInWindows(const vector<int>& num, unsigned int size)
{
vector<int> result;
if(size<1 || num.size()<size) return result;
int i,j,t; //i指向当前访问元素,j指向当前最大元素,当j不在滑动窗口内时用t更新j
int m=0;
for(i=0;i<size;++i){//获得第一个滑动窗口内的最大值
if(num[i]>m) m=num[i],j=i;
}
result.push_back(m);
while(i<num.size()){ //i始终指向当前滑动窗口的最后一个元素
if(num[i]>m){ //更新当前滑动窗口内的最大值
m=num[i];
j=i;
}
else if(i-j==size){ //j指向的当前最大元素不在滑动窗口内
t=j+1;
m=num[t];
j=t;
while(t<=i){ //更新当前滑动窗口内的最大值
if(num[t]>m) m=num[t],j=t;
++t;
}
}
result.push_back(m);
++i;
}
return result;
}
};