栈思想
- 和含有min函数的栈那像:保存极值,当极值更新为新的数字或者追溯到上一个极值,追溯+时间O(n) 意味着不能遍历,每次移动都要保存当前情况下的极值。
- 窗口移动时,如果过期元素恰好为极值,那么重新寻找,不然新元素只需要和v的尾部元素比较,尾部元素代表i~i+size-2的最大值。
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param num int整型vector
* @param size int整型
* @return int整型vector
*/
vector<int> maxInWindows(vector<int>& num, int size) {
// write code here
vector<int> v;
if(size>num.size()||!size)
{
return v;
}
for(int i=0;i+size<=num.size();i++)
{
if(i==0||v[v.size()-1]==num[i-1])
{
//重新找最大值
int j=0;
int m=0;
while(j<size)
{
m=max(m,num[j+i]);
j++;
}
//最大值
v.push_back(m);
}
else{
if(v[v.size()-1]<num[i+size-1])
{
//新的值是最大值
v.push_back(num[i+size-1]);
}
else{
v.push_back(v[v.size()-1]);
}
}
}
return v;
}
};
单调队列
- 构造单调队列,双头队列可以从前后删除特性使得保存次极值和次次极值等,不需要像数组或者栈一样遍历重新寻找
- 边界情况在i>size-1时,此时极值才符合窗口。以及过期索引问题
#include <deque>
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param num int整型vector
* @param size int整型
* @return int整型vector
*/
vector<int> maxInWindows(vector<int>& num, int size) {
// write code here
vector<int> v;
if(num.empty()||size==0||size>num.size())
{
return v;
}
deque<int> dq;
for(int i=0;i<num.size();i++)
{
while(!dq.empty()&&num[dq.back()]<num[i])
{
dq.pop_back();
}
dq.push_back(i);
if(dq.front()+size<=i)
{
dq.pop_front();
}
if(i>=size-1)
{
v.push_back(num[dq.front()]);
}
}
return v;
}
};