PROBLEM

剑指 Offer 59 - I. 滑动窗口的最大值

难度 困难

MY ANSWER

使用优先队列维护滑动窗口,存储值和索引,时间复杂度O(nlogn),空间复杂度O(n)。

BETTER SOLUTION

使用deque构造单调栈维护滑动窗口,保存了从最大值开始的递减序列。时间复杂度O(n),空间复杂度O(k)。

每次滑动,出窗元素若是最大值,则单调栈栈底出栈。然后检查栈顶是否大于入窗元素,若小于则出栈,以此来维护单调栈的单调性。最后将入窗元素入栈,栈底作为当前窗口的最大值加入到结果中。

class Solution {
public:
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
deque<int> tmp;
vector<int> res;
if(nums.empty()) {
return res;
}
tmp.push_back(nums[0]);
for(int i = 1; i < k; i++) {
while(tmp.size() && tmp.back() < nums[i]) {
tmp.pop_back();
}
tmp.push_back(nums[i]);
}
res.push_back(tmp.front());
for(int i = 0; i < nums.size() - k; i++) {
if(nums[i] == tmp.front()) {
tmp.pop_front();
}
while(tmp.size() && tmp.back() < nums[i+k]) {
tmp.pop_back();
}
tmp.push_back(nums[i+k]);
res.push_back(tmp.front());
}
return res;
}
};

SUMMARY

复习单调栈的用法,当需要获得最大/最小值且有序的信息,考虑使用单调栈。