题目链接
思路分析
读者在阅读这道题目之前可以先阅读队列的最大值
滑动窗口 最大值, 我们可以联想前面的队列最大值的题目
- 两者思路较为相似,都是求一个滑动窗口中的最大值,我们就需要一个最大值队列,来存储窗口中的最大值
- 当窗口开始滑动时,就相当于我们将元素添加到队列中,然后删除划走的元素,每次取队列的最大值
代码实现
class Solution {
public:
deque<int> d;
void push(deque<int>& d, int val)
{
while(!d.empty() && val > d.back())
d.pop_back();
d.push_back(val);
}
void pop(deque<int>& d, int val)
{
int ret = d.front();
if(ret == val)
d.pop_front();
}
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
if(nums.size() == 0)
return {};
int i = 0;
int j = k-1;
for(; i < k; ++i)
{
push(d, nums[i]);
}
for(int num : d)
cout << num << " ";
vector<int> ret;
ret.push_back(d.front());
for(int i = k; i < nums.size(); ++i)
{
pop(d, nums[i-k]);
push(d, nums[i]);
//cout << d.front() << " ";
ret.push_back(d.front());
}
return ret;
}
};