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

滑动窗口的最大值

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

滑动窗口的最大值:最直观的想法是,两层for循环,外层i表示每次窗口的起始位置,内层j表示每次窗口的结束位置,遍历窗口内的每一个元素,然后取窗口内的最大值,并加入到结果数组中。注意,当数组为空时或者滑动窗口值大于数组长度,要返回空数组。(牛客这个暴力方法居然过啦)

vector<int> maxInWindows(const vector<int>& num, unsigned int size) 
{
     vector<int> res;
     // 数组为空 或者 滑动窗口值大于数组长度
     if(num.size()==0||size>num.size())
        return res;
     int maxn;
     // i表示起始位置
     for(int i=0;i+size-1<num.size();i++)
     {
         maxn=num[i];
         // j表示结束位置 遍历整个窗口
         for(int j=i+1;j<=i+size-1;j++)
         {
            maxn=max(num[j],maxn);
         }
         // 将最大值加入结果
         res.push_back(maxn);
     }
     return res;
}

优化:上述方法其实包含很多重复计算,我们可以通过分析来优化。如果当前元素大于前面元素,那么前面的元素不可能成为最大值,故需要将前面的元素从队尾出队;如果当前元素小于等于前面元素,那么需要将元素从队尾入队,因为该元素可能会成为后续的最大值。同时,我们要判断窗口内元素是否过期,即队头元素下标是否小于当前窗口左端,由于要方便统计窗口边界,故使用的是下标存储,当超过边界不合法时需要从队头出队;最后要判断当前元素下标是否满足一个窗口长度,因为只有有窗口才可以将当前窗口内的最大值加入结果数组。注意,使用的是双端队列!这样就维护了一个长度为size的单调递减队列,每次都从队头取窗口内的最大值!

vector<int> maxInWindows(const vector<int>& num, unsigned int size) 
{
     vector<int> res;
     // 数组为空 或者 滑动窗口值大于数组长度
     if(num.size()==0||size>num.size())
        return res;
     // 双端队列
     deque<int> dq;
     for(int i=0;i<num.size();i++)
     {
        // 如果当前元素大于之前的 则将之前的元素依次从队尾弹出 从而保证维护的是单调递减队列
        while(!dq.empty()&&num[i]>num[dq.back()])
           dq.pop_back();
        // 将元素下标入队 以便后续判断元素是否在窗口内
        dq.push_back(i);
        // 若队头元素不合法就从队头弹出 双端队列维持长度为size 队首小于窗口左端则过期
        if(i-dq.front()+1>size)
           dq.pop_front();
        // 当满足窗口长度时就将窗口最大值加入结果数组
        if(i>=size-1)
           res.push_back(num[dq.front()]);
     }
     return res;
}

#滑动窗口的最大值#
剑指offer 文章被收录于专栏

剑指offer专栏主要分享剑指offer题解。

全部评论

相关推荐

点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
正在热议
更多
# 一张图晒出你司的标语 #
4459次浏览 78人参与
# 找AI工作可以去哪些公司? #
10134次浏览 317人参与
# 米连集团26产品管培生项目 #
13485次浏览 285人参与
# 你的实习产出是真实的还是包装的? #
20825次浏览 346人参与
# 从事AI岗需要掌握哪些技术栈? #
9839次浏览 391人参与
# 春招至今,你的战绩如何? #
67871次浏览 599人参与
# 开放七大实习专项,百度暑期实习值得冲吗 #
15717次浏览 229人参与
# AI面会问哪些问题? #
29148次浏览 633人参与
# 你做过最难的笔试是哪家公司 #
36013次浏览 315人参与
# 中国电信笔试 #
32394次浏览 302人参与
# 金三银四,你的春招进行到哪个阶段了? #
22565次浏览 284人参与
# 投递几十家公司,到现在0offer,大家都一样吗 #
341233次浏览 2176人参与
# 同bg的你秋招战况如何? #
212267次浏览 1121人参与
# 哪些公司真双非友好? #
69823次浏览 289人参与
# 如何准备秋招 #
78324次浏览 868人参与
# 阿里笔试 #
179462次浏览 1324人参与
# 应届生被毁约被毁意向了怎么办 #
63354次浏览 305人参与
# 机械人避雷的岗位/公司 #
62727次浏览 393人参与
# 小马智行求职进展汇总 #
25151次浏览 80人参与
# 第一份工作一定要去大厂吗 #
15213次浏览 124人参与
# 担心入职之后被发现很菜怎么办 #
291432次浏览 1210人参与
# 为了减少AI幻觉,你注入过哪些设定? #
26324次浏览 310人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务