单调栈与单调队列

news2024/12/23 22:39:35

单调栈与单调队列

  • 一、单调栈
    • 1.1 思路
    • 1.2 例题:单调栈
  • 二、单调队列
    • 2.1 思路
    • 2.2 例题:滑动窗口

一、单调栈

1.1 思路

单调栈主要解决以下问题:
1️⃣ 寻找下一个更大元素
2️⃣ 寻找前一个更大元素
3️⃣ 寻找下一个更小元素
4️⃣ 寻找前一个更小元素

1.2 例题:单调栈

题目链接

题目描述

给定一个长度为 N 的整数数列,输出每个数左边第一个比它小的数,如果不存在则输出 −1。

输入格式

第一行包含整数 N,表示数列长度。
第二行包含 N 个整数,表示整数数列。

输出格式

共一行,包含 N 个整数,其中第 i 个数表示第 i 个数的左边第一个比它小的数,如果不存在则输出 −1。

数据范围

1≤N≤105
1≤数列中元素≤109

输入样例:

5
3 4 2 7 5

输出样例:

-1 3 -1 2 2

思路分析
每当插入一个数据时,就要把已经入栈的数据向前遍历,删除前面比插入数据大的元素,这样,每个元素前一个就是第一个比它小的数。
在这里插入图片描述

#include <iostream>

using namespace std;

const int N = 1e5 + 10;

int st[N], idx;

int main()
{
    int n;
    cin >> n;
    while(n--)
    {
        int x;
        cin >> x;
        while(idx && st[idx] >= x) idx--;
        if(!idx) printf("%d ", -1);
        else printf("%d ", st[idx]);
        st[++idx] = x;
    }
    return 0;
}

二、单调队列

2.1 思路

单调队列就是单调递减或单调递增的队列。最经典的题目就是求滑动窗口的最小值和最大值。
当给我们一个不单调的序列时,我们需要删除一些没有用的元素使之单调。
给定一个序列,给一个大小为3的滑动窗口,求每次滑动窗口的最小值:
在这里插入图片描述
我们可以使用队列,但是可以把一些不必要的元素抽取出来,这样始终保证使队头的元素是最小的
在这里插入图片描述

2.2 例题:滑动窗口

题目描述

给定一个大小为 n≤106 的数组。有一个大小为 k的滑动窗口,它从数组的最左边移动到最右边。你只能在窗口中看到 k个数字。每次滑动窗口向右移动一个位置。以下是一个例子:
该数组为 [1 3 -1 -3 5 3 6 7],k为 3。

窗口位置最小值最大值
[1 3 -1] -3 5 3 6 7-13
1 [3 -1 -3] 5 3 6 7-33
1 3 [-1 -3 5] 3 6 7-35
1 3 -1 [-3 5 3] 6 7-35
1 3 -1 -3 [5 3 6] 736
1 3 -1 -3 5 [3 6 7]37

你的任务是确定滑动窗口位于每个位置时,窗口中的最大值和最小值。

输入格式

输入包含两行。
第一行包含两个整数 n和 k,分别代表数组长度和滑动窗口的长度。
第二行有 n个整数,代表数组的具体数值。
同行数据之间用空格隔开。

输出格式

输出包含两个。
第一行输出,从左至右,每个位置滑动窗口中的最小值。
第二行输出,从左至右,每个位置滑动窗口中的最大值。

输入样例:

8 3
1 3 -1 -3 5 3 6 7

输出样例:

-1 -3 -3 -3 3 3
3 3 5 5 6 7

#include <iostream>

using namespace std;

const int N = 1e6;
int a[N], q[N];

int main()
{
    int hh = 0, tt = -1;
    int n, k;
    cin >> n >> k;
    for(int i = 0; i < n; i++) cin >> a[i];
    for(int i = 0; i < n; i++)
    {
        if(hh <= tt && i - k + 1 > q[hh]) ++hh;
        while(hh <= tt && a[q[tt]] >= a[i]) --tt;
        q[++tt] = i;
        if(i >= k - 1) printf("%d ", a[q[hh]]);
    }
    printf("\n");
    hh = 0, tt = -1;
    for(int i = 0; i < n; i++)
    {
        if(hh <= tt && i - k + 1 > q[hh]) ++hh;
        while(hh <= tt && a[q[tt]] <= a[i]) --tt;
        q[++tt] = i;
        if(i >= k - 1) printf("%d ", a[q[hh]]);
    }
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/173577.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

理性和感性 - 如何对待错误

上次的博客&#xff0c; 我写了一些关于 软件开发中的理性和感性决定 的故事。 不论是感性还是理性&#xff0c;我们的目的就是要把软件交给用户去用&#xff0c; 在软件行业中有这样一句俗话&#xff1a; 当你把产品交给用户的时候&#xff0c;你的学习才刚刚开始。 当然每个团…

【设计模式】结构型模式·桥接模式

学习汇总入口【23种设计模式】学习汇总(数万字讲解体系思维导图) 写作不易&#xff0c;如果您觉得写的不错&#xff0c;欢迎给博主来一波点赞、收藏~让博主更有动力吧&#xff01; 一.概述 将抽象与实现分离&#xff0c;使它们可以独立变化。用组合关系代替继承关系&#xff0c…

华为数字化转型之道 结语 数字化转型的8个成功要素

结语 数字化转型的8个成功要素 华为开展数字化转型的过程中,积累了一些经验和教训,总结起来有如下成功要素。 1. 一把手担责 要做好数字化转型,企业家就要有战略决心、信心、耐心。数字化转型一定是企业“一把手工程”,需要企业家自上而下地推动并在企业内达成广泛共识。…

免费开题报告|基于SpringBoot+Vue的校内跑腿平台

作者主页&#xff1a;编程指南针 作者简介&#xff1a;Java领域优质创作者、CSDN博客专家 、掘金特邀作者、多年架构师设计经验、腾讯课堂常驻讲师 主要内容&#xff1a;Java项目、毕业设计、简历模板、学习资料、面试题库、技术互助 收藏点赞不迷路 关注作者有好处 文末获取源…

Android 深入系统完全讲解(29)

MediaMuxer 封装器 MediaMuxer 最多仅支持一个视频 track 和一个音频 track&#xff0c;所以如果有多个音频 track 可以先 把它们混合成为一个音频 track 然后再使用 MediaMuxer 封装到 mp4 容器中。 MediaMuxer 支持输出格式为 MP4&#xff0c;webm 和 3gp. 默认我们就用 mp4.…

产生聚类数据集sklearn.datasets.make_blobs()

【小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【Python-数据分析】 产生聚类数据集 sklearn.datasets.make_blobs() [太阳]选择题 以下python代码结果错误的一项是? import matplotlib.pyplot as plt from sklearn.datasets import make_blobs data,labelmak…

统计-参数估计-假设检验-总结二

统计-参数估计-假设检验-总结二参数估计—区间估计三大分布卡方分布(Gamma分布的特例)t分布F分布求估计区间假设检验参数检验拟合优度检验通往 统计-参数估计-假设检验-总结一参数估计—区间估计 以某一范围提供对参数θ\thetaθ的估计。寻找统计量θ1∗(x1,x2,...,xn)\theta…

20230120英语学习

How Animals May Have Conquered Snowball Earth “雪球地球”时期&#xff0c;动物是如何存活的&#xff1f; Planet Earth used to be something like a cross between a deep freeze and a car crusher.During vast stretches of the planet’s history, everything from p…

微信小程序开发尚学堂 介绍 项目结构 组件 喧嚷 事件 模板

一、微信小程序介绍1. 微信小程序介绍微信小程序&#xff0c;简称小程序&#xff0c;是一种不需要下载安装即可使用的应用&#xff0c;它实现了应用”触手可及”的梦想&#xff0c;用户扫一扫或搜一下即可打开应用。说明&#xff1a;小程序是需要下载的&#xff0c;小程序的占用…

概论_第6章_统计量及其抽样分布_知识结构

先看知识结构图数量统计的特点是 背记的内容多&#xff0c; 与前面概率论 背记和计算的多 有很大区别。本文从统计量的概念讲起, 一. 统计量定义&#xff1a; 设 ...... 为取自某总体的样本&#xff0c; 若样本函数TT(, ... ) 中不含有任何未知参数&#xff0c; 则称T 为统计…

力扣刷题记录——682. 棒球比赛、628. 三个数的最大乘积、693. 交替位二进制数

本专栏主要记录力扣的刷题记录&#xff0c;备战蓝桥杯&#xff0c;供复盘和优化算法使用&#xff0c;也希望给大家带来帮助&#xff0c;博主是算法小白&#xff0c;希望各位大佬不要见笑&#xff0c;今天要分享的是——《力扣刷题记录——682. 棒球比赛、628. 三个数的最大乘积…

企业实施RPA需考虑的20条建议

如何提高效率又能降低成本&#xff0c;是企业发展所面临的重要挑战。在降本增效的路上&#xff0c;RPA&#xff08;机器人流程自动化&#xff09;以其特点与优势脱颖而出&#xff0c;迅速得到企业青睐。尽管如此&#xff0c;部署RPA也并非一蹴而就。仓促实施可能会给企业带来更…

实时时钟实现

重要知识点 setInterval是一个实现定时调用的函数&#xff0c;可按照指定的周期&#xff08;以毫秒计&#xff09;来调用函数或计算表达式var sNownew Date()&#xff0c;Date 对象会自动把当前日期和时间保存为其初始值。 参数形式有以下&#xff15;种&#xff1a; new Dat…

SpringBoot 接口幂等性实现的4种方案

目录 什么是幂等性 什么是接口幂等性 为什么需要实现幂等性 引入幂等性后对系统的影响 Restful API 接口的幂等性 如何实现幂等性 方案一&#xff1a;数据库唯一主键 方案二&#xff1a;数据库乐观锁 方案三&#xff1a;防重 Token 令牌 方案四、下游传递唯一序列号 实…

mysql连接查询

笛卡尔积现象&#xff1a; 注意&#xff1a; 效率更高的方法&#xff1a;

Pr 计时器动画

​哈喽&#xff0c;各位小伙伴&#xff01;今天我们来学习一下如何制作数字滚动的计时器动画&#xff1f; 新建序列 新建一个1920*1080的序列&#xff0c;选择一张图片作为背景&#xff08;背景图出自不良人第5季&#xff0c;距离第6季开播还有41天&#xff09; 新建文字图层…

5.算法通关面试 --- 递归and分治and贪心

50. Pow(x, n) https://leetcode.cn/problems/powx-n/

【C语言从0到1之文件操作】(原理 画图 举例 不信教不会你 不要放收藏夹落灰 学起来好嘛)

&#x1f57a;作者&#xff1a;迷茫的启明星 &#x1f383;专栏&#xff1a;《数据库》《C语言从0到1专栏》《数据结构》《C语言杂谈》&#x1f3c7;分享喜欢的一句话&#xff1a;心如花木&#xff0c;向阳而生前言在我们的学习中&#xff0c;文件操作是被我们忽略&#xff0c;…

ML 训练与测试数据不满足同分布 - 如何检测?如何解决?

&#x1f604; 同分布问题是数据挖掘中的常见问题&#xff0c;也是ML中的一个重要假设。解决训练与测试数据不满足同分布问题&#xff0c;有助于提高模型的泛化性、稳定性&#xff01; 文章目录一、定义&#xff1a;训练与测试数据不满足同分布定义&#xff1a;❓疑问&#xff…

仿牛客论坛项目

源代码:https://gitee.com/qiuyusy/community 1. Spring 在测试类中使用Spring环境 RunWith(SpringRunner.class) 让Spring先运行ContextConfiguration 导入配置文件implements ApplicationContextAware 后实现方法 获得 applicationContext RunWith(SpringRunner.class) S…