给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。
返回 滑动窗口中的最大值 。
leetcode原题:https://leetcode.cn/problems/sliding-window-maximum
思路:
直观思路就是暴力,暴力是万能的。每向右滑动一下,都有k个数,遍历这k个数,可以得到一个最大值。维持k个数的最大值,还有一个方法也很直观,就是使用优先队列,即大根堆。时空复杂度更好的就是使用双端队列,让队列里的数,时刻保持单调递减。这样每次取最大值的时候直接使用队列头部的数即可。使用双端队列的时候,入队的是什么也很重要,一开始想的是入数组里的数,发现窗口左端右移的时候不好判断。而把下标入队,就非常容易了。
代码:
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
vector<int> ans;
deque<int> window;
for(int i = 0;i < k;i++) {
while(window.size() > 0 && nums[window.back()] <= nums[i]){
window.pop_back();
}
window.push_back(i);
}
ans.push_back(nums[window.front()]);
for(int i = k;i < nums.size();i++) {
while(window.size() > 0 && nums[window.back()] <= nums[i]){
window.pop_back();
}
window.push_back(i);
while(i-k+1 > window.front()) {
window.pop_front();
}
ans.push_back(nums[window.front()]);
}
return ans;
}