码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 单调队列 → 常用于动态规划问题的优化


    【算法解析】
    单调队列是指在队尾入队出队,在队首出队,且其元素具有单调性的特殊队列。其中,在队尾入队出队的操作是用来维护单调队列的单调性,在队首出队的操作是用来维护单调队列的大小。单调队列常用于动态规划问题的优化。

    在实践中,单调队列或者用数组模拟实现,或者用STL中的deque实现,不能用STL中的queue实现。

    特别注意,单调队列里存放的是原始序列的元素下标,而不是元素值。这是因为我们无法用元素值来判断元素是否过期。但是,我们在下文中谈论元素大小时,指的不是原始序列的元素下标的大小,而是元素下标在原始序列中对应的元素值的大小。

    单调队列求最值时的进出队规则,可助记如下:
    ★ 构建
    单调递减队列的目的在于求最大值,求最大值时的操作为“大覆盖,小附加”(即:原始序列的待操作的元素,若比单调队列的队尾元素大,则按从单调队列的队尾元素向队首元素的方向,依序覆盖掉所有比原始序列的待操作的元素小的元素,直至遇到比原始序列的待操作的元素大的元素后终止;原始序列的待操作的元素,若比单调队列的队尾元素小,则附加到单调队列的队尾元素后面成为新的队尾元素)
    ★ 构建
    单调递增队列的目的在于求最小值,求最小值时的操作为“小覆盖,大附加”(即:原始序列的待操作的元素,若比单调队列的队尾元素小,则按从单调队列的队尾元素向队首元素的方向,依序覆盖掉所有比原始序列的待操作的元素大的元素,直至遇到比原始序列的待操作的元素小的元素后终止;原始序列的待操作的元素,若比单调队列的队尾元素大,则附加到单调队列的队尾元素后面成为新的队尾元素)

    滑动窗口求最值问题,是单调队列的一个典型实践,它在基于队列优化的多重背包问题中有应用。题目来源于:
    https://www.acwing.com/problem/content/156/
    https://www.luogu.com.cn/problem/P1886

    若给定滑动窗口大小为3,原始序列为{1, 3, -1, -3, 5, 3, 6, 7},则滑动窗口求最值问题利用单调队列模拟的执行过程如下图所示:

     


    【算法代码一】

    1. #include
    2. using namespace std;
    3. const int maxn=1000005;
    4. int q1[maxn],q2[maxn];
    5. int a[maxn];
    6. int n,k;
    7. void minque() {
    8. int h=1,t=0;
    9. for(int i=1; i<=n; i++) {
    10. while(h<=t && k<=i-q1[h]) h++;
    11. while(h<=t && a[i]<=a[q1[t]]) t--;
    12. q1[++t]=i;
    13. if(i>=k) {
    14. printf("%d ",a[q1[h]]);
    15. }
    16. }
    17. }
    18. void maxque() {
    19. int h=1,t=0;
    20. for(int i=1; i<=n; i++) {
    21. while(h<=t && k<=i-q2[h]) h++;
    22. while(h<=t && a[i]>=a[q2[t]]) t--;
    23. q2[++t]=i;
    24. if(i>=k) {
    25. printf("%d ",a[q2[h]]);
    26. }
    27. }
    28. }
    29. int main() {
    30. scanf("%d%d",&n,&k);
    31. for(int i=1; i<=n; i++) {
    32. scanf("%d",&a[i]);
    33. }
    34. minque();
    35. cout<
    36. maxque();
    37. return 0;
    38. }
    39. /*
    40. in:
    41. 8 3
    42. 1 3 -1 -3 5 3 6 7
    43. out:
    44. -1 -3 -3 -3 3 3
    45. 3 3 5 5 6 7
    46. */


    【算法代码二】

    1. #include
    2. using namespace std;
    3. const int maxn=1000005;
    4. int a[maxn];
    5. deque<int> q; //q存放编号
    6. int n,k;
    7. void que_min() {
    8. q.clear();
    9. for(int i=1; i<=n; i++){
    10. while(!q.empty() && i-k>=q.front()) q.pop_front();
    11. while(!q.empty() && a[i]<=a[q.back()]) q.pop_back();
    12. q.push_back(i);
    13. if(i>=k) cout<front()]<<" ";
    14. }
    15. }
    16. void que_max() {
    17. q.clear();
    18. for(int i=1; i<=n; i++){
    19. while(!q.empty() && i-k>=q.front()) q.pop_front();
    20. while(!q.empty() && a[i]>=a[q.back()]) q.pop_back();
    21. q.push_back(i);
    22. if(i>=k) cout<front()]<<" ";
    23. }
    24. }
    25. int main() {
    26. cin>>n>>k;
    27. for(int i=1; i<=n; i++) cin>>a[i];
    28. que_min();
    29. cout<
    30. que_max();
    31. return 0;
    32. }
    33. /*
    34. input:
    35. 8 3
    36. 1 3 -1 -3 5 3 6 7
    37. output:
    38. -1 -3 -3 -3 3 3
    39. 3 3 5 5 6 7
    40. */



    【参考文献】
    https://zhuanlan.zhihu.com/p/447209490
    https://www.bilibili.com/video/BV1vv4y1K7qn/
    https://sweetlemon.blog.luogu.org/dan-diao-dui-lie
    https://www.cnblogs.com/I-Love-You-520/p/13454305.html
    https://zhuanlan.zhihu.com/p/346354943
    https://blog.csdn.net/weixin_43534024/article/details/88615285
    https://blog.csdn.net/hnjzsyjyj/article/details/109680717

     

  • 相关阅读:
    pb:导入EXCEL,提示“不能连接EXCEL”
    DDRx寻址原理
    关于el-input-number在el-table中只能点击一次的问题完美解决答案
    解决网络协议服务器问题的关键:定位能力与抓包技术
    传奇黑客成『吹哨人』,推特麻烦了;谷歌20+技术学习路线;Python数据科学电子书;游戏智能体开发平台;前沿论文 | ShowMeAI资讯日报
    计算机竞赛 目标检测-行人车辆检测流量计数
    【无标题】
    K8s进阶6——pod安全上下文、Linux Capabilities、OPA Gatekeeper、gvisor
    C++学习笔记(十八)
    关于c#多线程中的几个信号量
  • 原文地址:https://blog.csdn.net/hnjzsyjyj/article/details/126381659
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号