题解 | #滑动窗口的最大值#
滑动窗口的最大值
https://www.nowcoder.com/practice/1624bc35a45c42c0bc17d17fa0cba788
class Solution {
public:
//方法一: 双向队列
vector<int> maxInWindows(const vector<int>& nums, int size) {
vector<int> res;
//窗口小于于数组长度才行
if(size<=nums.size()&&size!=0)
{
deque<int> dq; //双向队列
for(int i=0;i<size;i++)
{
//去掉比自己先进队列的小于自己的值
while(!dq.empty()&&nums[dq.back()]<nums[i])
{
dq.pop_back();
}
dq.push_back(i);
}
//遍历后续数组元素
for(int i=size;i<nums.size();i++)
{
res.push_back(nums[dq.front()]);
while(!dq.empty()&&dq.front()<(i-size+1))
dq.pop_front(); //弹出窗口移走后的值
//加入新的值前,去掉比自己先进队列但比自己小的值
while(!dq.empty()&&nums[i]>nums[dq.back()])
{
dq.pop_back();
}
dq.push_back(i);
}
res.push_back(nums[dq.front()]);
}
return res;
}
/*
//方法二: 暴力法优化
vector<int> maxInWindows(const vector<int>& nums, int size) {
vector<int> res(nums.size()-size+1);
int index=-1;
int max=-10001;
for(int i=0;i<=nums.size()-size;i++)
{
if(index<i) //情况一
{
max=-10001;
for(int j=i;j<i+size;j++)
{
if(nums[j]>max)
{
max=nums[j];
index=j;
}
}
}
else //情况二
{
if(max<nums[i+size-1])
{
max=nums[i+size-1];
index=i+size-1;
}
}
res[i]=max;
}
return res;
}
*/
/*
//方法三: 暴力求解 vector
vector<int> res(nums.size()-size+1);
for(int i=0;i<=nums.size()-size;i++)
{
int max=nums[i];
for(int j=i;j<i+size;j++)
{
if(nums[j]>max)
{
max=nums[j];
}
}
res[i]=max;
}
return res;
}
*/};
查看11道真题和解析