07.STL单调栈

news/2024/7/7 19:17:39

单调栈的特点:

1.自顶向下一次递增,也就是上小下大的栈

单调栈代码:

算法思想:将不符合单调栈性质的弹出,符合的输入

#include<iostream>
#include <stack>
#include<queue>
using  namespace std;
void text01(){
    int a[]={5,2,1,3,4};
    stack<int> stk;
    for(int i=0;i<5;i++){
        //while循环,将不符合单调栈性质的元素依次弹出
        while(!stk.empty()&&a[i]>=stk.top()){
            stk.pop();
        }
        //循环后,要么时栈空,要么是input<top(),都应该入栈
//        if(stk.empty()) stk.push(a[i]);
//        else if(a[i]<stk.top()) stk.push(a[i]);
        stk.push(a[i]); 
    }
}
int main() {
    text01();
    return 0;
}

单调栈的应用:

1.题目符合单调栈,自定向下一次递增性质的习题

2.笛卡尔树(基于单调栈、查询右链)

习题:P2947 [USACO09MAR] Look Up S(奶牛仰望对象)

法一:数组双重for循环

但是会超时,因为给的数据最大时1e5,双重循环时1e10,超时边缘时1e7,所以肯定会超时

#include<iostream>
#include<queue>
using  namespace std;
const int N=1e5+10;
int a[N],n;
void text01(){
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    for(int i=1;i<=n;i++){
        bool flag=false;
        for(int j=i+1;j<=n;j++){
            if(a[i]<a[j]){
                flag=true;
                cout<<j<<endl;
                break;
            }
        }
        if(!flag) cout<<"0"<<endl;
    }
}
int main() {
    text01();
    return 0;
}

法二:利用单调栈

#include<iostream>
#include <stack>
#include<queue>
using  namespace std;
const int N=1e5+10;
int h[N],n,a[N];
void text01(){
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>h[i];
    }
    stack<int> stk;
    for(int i=n;i>=1;i--){
        //while循环,将不符合单调栈性质的元素依次弹出
        while(!stk.empty()&&h[i]>=h[stk.top()]){
            stk.pop();
        }
        if(stk.empty()){
            a[i]=0;
            stk.push(i);
        }
        else{
            a[i]=stk.top();
            stk.push(i);
        }
    }
    for(int i=1;i<=n;i++){
        cout<<a[i]<<endl;
    }
}
int main() {
    text01();
    return 0;
}

http://lihuaxi.xjx100.cn/news/2039433.html

相关文章

k8s 基础理论

一、k8s概述 K8S 的全称为 Kubernetes&#xff0c;其作用为用于自动部署、扩展和管理“容器化&#xff08;containerized&#xff09;应用程序”的开源系统。可以理解成 K8S 是负责自动化运维管理多个容器化程序&#xff08;比如 Docker&#xff09;的集群&#xff0c;是一个生…

基于RHEL8部署Zabbix6.0,监控不再困难!

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是【IT邦德】&#xff0c;江湖人称jeames007&#xff0c;10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】&#xff01;&#x1f61c;&am…

60天算法训练总结

这段时间里感受过一遍一遍审视题目又无从下手的无奈&#xff0c;有时甚至题解都看不明白&#xff0c;因此也曾陷入迷茫&#xff0c;看着那些晦涩的名词再一次审视自己&#xff1a;“我真的适合学算法吗”&#xff0c;“我的理解能力会不会有问题”&#xff0c;“为什么他们能想…

盘点人工智能深度学习的五大模型

人工智能、机器学习、深度学习已经成为当下最热门的前端科技之一&#xff0c;机器学习、深度学习是人工智能下面细分的分支。深度学习是人工智能领域的一个最核心分支&#xff0c;深度学习的五个常用模型分别是RNN&#xff08;循环神经网络&#xff09;、CNN&#xff08;卷积神…

SpringBoot框架下实现Mysql数据库定期备份、备份文件加密压缩存储、删除过期备份文件

创建定时任务类 内容仅供参考 import com.ruoyi.common.utils.file.FileUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component;import java.io.File; import java.text.SimpleDateFormat; import java.util.Da…

Java集合框架-1

目录 List集合 常见方法 迭代器&#xff08;Iterator&#xff09; List集合特有方法 List 的特点 创建 List 遍历List Java集合框架是Java编程语言提供的各种数据结构和算法的实现。它提供了不同类型的集合类&#xff0c;如列表(List)、集(Set)、映射(Map)等&#xff0c…

Hive中几种常见的表

Hive的表类型主要有&#xff1a;内部表&#xff08;受控表/管理表&#xff09;、外部表、临时表、分区表、分桶表。 1. 内部表&#xff08;管理表&#xff09; 默认创建的表都是管理表/内部表&#xff0c;表数据默认存储在warehouse目录中&#xff0c;在加载数据的过程中&…

ArcGIS中查看栅格影像最大值最小值的位置

如果只是想大概获取栅格影像中最大值最小值的位置进行查看&#xff0c;可以不用编写程序获取具体的行列信息&#xff0c;只需要利用分类工具即可。 假设有一幅灰度影像数据&#xff0c;如下图所示。 想要查看最大值2116的大概位置在哪里&#xff0c;可以右击选择图层属性&…