借助一个辅助队列(双端队列),从头遍历数组,根据以下规则进行入队列或出队列操做:
1. 若是队列为空,则当前数字入队列
2. 若是当前数字大于队列尾,则删除队列尾,直到当前数字小于等于队列尾,或者队列空,而后当前数字入队列
3. 若是当前数字小于队列尾,则当前数字入队列
4. 若是队列头超出滑动窗口范围,则删除队列头
这样能始终保证队列头为当前的最大值c++
class Solution
{
public:
vector<int> maxSlidingWindow(vector<int>& nums, int k)
{
vector<int> f;
int n = nums.size();
if(n == 0 || k > n)
return f;
deque<int> que;
for(int i = 0; i < n; i++)
{
if(!que.empty())
{
if(i >= que.front()+k)
que.pop_front();
while(!que.empty() && nums[i] >= nums[que.back()])
que.pop_back();
}
que.push_back(i);
if(i+1 >= k)
f.push_back(nums[que.front()]);
}
return f;
}
};
//调用头文件:
#include<deque>
using namespace std;
//详细用法(部分):
deque<Type> k; //------ 定义一个deque的变量(定义时已经初始化) //例如: deque<int> k;
k.empty() //------ 查看是否为空范例,是的话返回1,不是返回0
k.clear() //------ 清除队列里的全部数据
k.push_front(i) //------ 从已有元素前面增长元素i(队伍大小不预设)
k.push_back(i) //------ 从已有元素后面增长元素i(队伍大小不预设)
k.pop_front() //------ 清除第一个元素
k.pop_back() //------ 清除最后一个元素
k.front() //------ 显示第一个元素 例如n = k.front();
k.back() //------ 显示最后一个元素
k.size() //------ 输出现有元素的个数