求滑动窗口的最大值-线性时间
题目:给定一个数组nums,有一个大小为k的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在 滑动窗口内的k个数字。滑动窗口每次只向右移动一位。
返回滑动窗口中的最大值。
进阶
你能在线性时间复杂度内解决此题吗?
分析:使用deque维护front位置始终最大的队列
#include "_myPrint.cpp"
#include "deque"
using namespace std;
class Solution{
public:
vector<int> maxSlideWindow(vector<int>& nums, int k){
vector<int> res;
deque<int> que;
// assume nums.size > k
// first window
que.push_back(nums[0]);
int i;
for (i = 1; i < k; i++){
while (nums[i] > que.front() && !que.empty()) que.pop_front();
que.push_back(nums[i]);
}
res.push_back(que.front());
// i = k, begin
for (; i < nums.size(); i++){
while (que.size() + 1 > k) que.pop_front(); // control window's size
while (nums[i] > que.front() && !que.empty()) que.pop_front();
que.push_back(nums[i]);
res.push_back(que.front());
}
return res;
}
};
int main(){
Solution s;
vector<int> res;
vector<int> nums = {1,3,-1,-3,5,3,6,7};
int k = 3;
res = s.maxSlideWindow(nums,k);
printCollection p;
p.printVector(res);
}