#include <climits> #include <vector> class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param num int整型vector * @param size int整型 * @return int整型vector */ vector<int> maxInWindows(vector<int>& num, int size) { // write code here if (num.size() < size || size <= 0) { return {}; } int len = num.size()-size+1; vector<int> ans; // 使用一个双端队列 保证队列中的数据非严格递减. deque<int> que; // 第一个滑动窗口. for (int i = 0; i < size; ++i) { if (i == 0) que.push_back(num[i]); else { while (!que.empty() && num[i] > que.back()) { que.pop_back(); } que.push_back(num[i]); } } ans.push_back(que.front()); // 4 3 2 | 1. for (int i = size; i < num.size(); ++i) { if (que.front() == num[i-size]) { que.pop_front(); } while(!que.empty() && num[i] > que.back()) { que.pop_back(); } que.push_back(num[i]); ans.push_back(que.front()); } return ans; } };
使用双端队列维持一个非严格递减的队列,此时队首元素为当前滑动窗口的最大值
需要注意队首元素子在窗口外的情况:
若窗口大小为 3 序列为 4 3 2 | 1
0 1 2 | 3
当遍历到 1 时,滑动窗口中数据为 4 3 2,但是此时 4 需要离开当前滑动窗口,判断条件为 que.front() == num[i-size]
Day3