Leetcode230滑动窗口最大值(大白话说思路)——数组专题

思路1:维护优先队列prioprity_queue<int,int>pq记录数组值和下标,push以后不断地判断队头是否下标在滑动窗口范围内,若不是出队,否则即为当前最大值。
思路2:维护双端队列deque<int>dq记录数据下标,维护一个单调递减的队列,每次判断队头下标是否在范围内,若不是pop_front,否则为当前最大值

思路二
代码

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

单调队列作用:
区间最小(最大)值问题。

单调栈的作用
以O(n)时间复杂度求出某个数的左边或右边第一个比它大或小的元素。

上一篇:nomn的使用


下一篇:面向对象第一单元总结——格式检查与定性计算