题解 | #滑动窗口的最大值#

滑动窗口的最大值

https://www.nowcoder.com/practice/1624bc35a45c42c0bc17d17fa0cba788

应该是最经典的hard题之一了。

基本思路:

  • 一个重要的性质:如果滑动窗口右端在j时,滑动窗口内部有num[i] <= num[j]且i < j,那么其实在j以及j的右端,num[i]已经完全失去了作用(相当于被j覆盖了),可以被删除。
  • 使用双端队列deque维护非递增序列,队头为滑动窗口最大值,向前移动添加元素时与队尾比较,把队尾所有小于该元素的元素全部删去再添加该元素;移除末位元素时仅需与队头比较,如果是队头则删除。
class Solution {
public:
    vector<int> maxInWindows(const vector<int>& num, unsigned int size) {
        vector<int> res;
        if (size == 0 || size > num.size()) return res;
        deque<int> dq;
        for (int i = 0; i < size; i++) {
            while (!dq.empty() && num[i] >= dq.back()) {
                dq.pop_back();
            }
            dq.push_back(num[i]);
        }
        res.push_back(dq.front());
        for (int i = size; i < num.size(); i++) {
            while (!dq.empty() && num[i] >= dq.back()) {
                dq.pop_back();
            }
            dq.push_back(num[i]);
            if (dq.front() == num[i - size]) dq.pop_front();
            res.push_back(dq.front());
        }
        return res;
    }
};

全部评论

相关推荐

09-19 13:59
门头沟学院 Java
用微笑面对困难:Trae一下,如果真成了,他用了直接发字节起诉代码版权,,这个代码不商用是没问题的如果没成也是情理之中的。
点赞 评论 收藏
分享
RajahnRan:公司赚到了,这可是一眼就手写出来的代码,ai都写不出来
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
正在热议
更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务