单调栈-java

本次主要通过数组模拟单调栈来解决问题。

目录

一、单调栈☀

二、算法思路☀

 1.暴力做法🌙

2.优化做法🌙

3.单调递增栈和单调递减栈🌙

三、代码如下☀

1.代码如下(示例):🌙

2.读入数据🌙

3.代码运行结果🌙

总结


前言

本次主要通过数组模拟单调栈来解决问题。


提示:以下是本篇文章正文内容,下面案例可供参考

一、单调栈☀

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

输入格式

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

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

输出格式

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

数据范围

1≤N≤100000
1≤数列中元素≤10^9

二、算法思路☀

我们引入一个整型数组arr来存储序列。

 1.暴力做法🌙

图1.1思路模拟 

我们要找寻数组中的每一个数的左边离它最小的数,如果找到就输出这个数;如果不存在的话就输出-1。那么我们就可以通过枚举数组中的每一个数,i表示数组中的第i个数。然后我们里面再写一层循环,用来枚举从数组第i-1个数到数组第1个数,用j来表示数组中第j个数。那么我们只需要来判断此时的数组第j个数是否小于第i个数即arr[j] < arr[i],如果小于的话,打印数组中的第j个数退出内循环,外循环接着进行下一层,依次类推。代码如下:

        for(int i = 1;i <= n;i++ ){
            for(int j = i - 1;j >= 1;j--){
                if (arr[j] < arr[i]){
                    //找到了,退出内层循环
                    pw.println(arr[j]);
                    break;
                }
            }
            //不存在,输出-1
            pw.println(-1);
        }

可以看出我们的时间复杂度是O(n^2),整数N的范围是到10^5,这样肯定会超时。

2.优化做法🌙

我们引入一个一维整型数组stack用来模拟栈;一个整型变量top表示栈顶指针。

图2.1 栈中元素模拟

因为我们需要找到离它左边最近的第一个小于它的元素。我们将这个元素左边的全部元素放入栈中,比如我们需要找第i个元素a_{i}的左边第1个小于它的元素,那么如果a_{i-1} >= a_{i},那么a_{i-1}就肯定不可能作为最终的结果被输出,将a_{i-1}出栈。然后我们接着找a_{i-2},接着比较如果a_{i-2}\geqslant a _{i},再将a_{i-2}出栈,直到找到一个小于a_{i}的值,退出循环。

如果此时栈是空栈,就说明没有一个值是小于a_{i}的,打印-1;如果栈不是空栈,此时栈顶元素就是a_{i}的左边第一个小于它的值。

下面是样例3 4 2 7 5过程中栈中数据的模拟过程:

图2.2模拟一

图 2.3模拟二

图2.4模拟三 

图2.5模拟四

 图2.6模拟五

        for(int i = 0;i < n;i++){
            int x = sc.nextInt();
            //将x左边大于等于x的元素出栈
            while (top != -1 && stack[top] >= x){
                top--;
            }
            //栈不为空,此时栈顶元素就是x的左边第一个小于x的值
            if(top != -1){
                pw.print(stack[top]+" ");
            }
            //栈为空,说明x的左边不存在小于x的值
            else {
                pw.print(-1+" ");
            }
            //将x入栈
            stack[++top] = x;
        }

通过上述操作,我们每个元素最多入栈和出栈1次,最终的时间复杂度也就是O(n)。

3.单调递增栈和单调递减栈🌙


单调递增栈:在保持栈内元素单调递增的前提下(如果栈顶元素大于要入栈的元素,将将其弹出),将新元素入栈。

单调递减栈:在保持栈内元素单调递减的前提下(如果栈顶元素小于要入栈的元素,则将其弹出),将新元素入栈。

三、代码如下☀

1.代码如下(示例):🌙

import java.io.*;
import java.util.*;

public class 单调栈 {
    static PrintWriter pw = new PrintWriter(new OutputStreamWriter(System.out));
    static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    static int N = 100010;
    static int[] stack = new int[N];
    static int top = -1;
    public static void main(String[] args) {
        Scanner sc = new Scanner(br);
        int n = sc.nextInt();
        for(int i = 0;i < n;i++){
            int x = sc.nextInt();
            while (top != -1 && stack[top] >= x){
                top--;
            }
            if(top != -1){
                pw.print(stack[top]+" ");
            }else {
                pw.print(-1+" ");
            }
            stack[++top] = x;
        }

        pw.flush();
    }
}

2.读入数据🌙

5
3 4 2 7 5

3.代码运行结果🌙

-1 3 -1 2 2 

总结

单调栈问题大致就这一种类型问题,并不复杂,本次问题主要还是通过单调栈来优化时间复杂度来解决暴力做法超时问题。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

学习记录:AUTOSAR R20-11的阅读记录(一)【Foundation(FO)】

一、OverView 1、AUTOSAR R20-11文档下载 官网下载&#xff1a;AUTOSAR 打包文档地址&#xff1a;AUTOSAR R20-11 2、文档组说明 AUTOSAR定义了三个文档组&#xff1a;ClassicPlatform(CP)、Adaptive Platform(AP)和Foundation(FO)&#xff0c;基于CP和AP的ECU基于共同标准F…

php基础知识快速入门

一、PHP基本知识 1、php介绍&#xff1a; php是一种创建动态交互性的强有力的服务器脚本语言&#xff0c;PHP是开源免费的&#xff0c;并且使用广泛。PHP是解释性语言&#xff0c;按顺序从上往下执行&#xff0c;无需编译&#xff0c;直接运行。PHP脚本在服务器上运行。 2、ph…

【算法】滑动窗口——无重复字符的最长子串

本篇博客是一篇滑动窗口算法练习题——无重复字符的最长子串的思路详解&#xff0c;从最开始的暴力解法&#xff0c;优化以及怎么想到滑动窗口这种算法的一个详细思路过程&#xff0c;有需要借鉴即可。 目录 1.题目解读2.暴力求解3.暴力求解的优化4.题解代码示例 1.题目解读 题…

超详细——集成学习——Adaboost——笔记

资料参考 1.【集成学习】boosting与bagging_哔哩哔哩_bilibili 集成学习——boosting与bagging 强学习器&#xff1a;效果好&#xff0c;模型复杂 弱学习器&#xff1a;效果不是很好&#xff0c;模型简单 优点 集成学习通过将多个学习器进行结合&#xff0c;常可获得比单一…

无经验计科应届生前端面试遇到的问题整理

js数据类型有几种&#xff0c;分别是 原始数据类型&#xff08;Primitive data types&#xff09;: 字符串&#xff08;String&#xff09;: 用于表示文本数据&#xff0c;使用单引号&#xff08;‘’&#xff09;或双引号&#xff08;“”&#xff09;括起来。 数字&#xff…

27-代码随想录三数之和

15. 三数之和 中等 给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请 你返回所有和为 0 且不重复的三元组。 注意&#xff1a;答案中不可以包含重…

C++ 如何进阶?

一、C基础&#xff08;3个月&#xff09; 1、面向对象的三大特性&#xff1a;封装、继承、多态 2、类的访问权限&#xff1a;private、protected、public 3、类的构造函数、析构函数、赋值函数、拷贝函数 4、移动构造函数与接贝构造函数对比 5、深接贝与浅贝的区别 6、空…

创新指南|组织健康仍然是企业创新长期绩效的关键

麦肯锡关于组织健康的最新调查结果表明&#xff0c;它仍然是当今全球市场中价值创造的最佳预测者和竞争优势的可持续来源。在本文中&#xff0c;我们将探讨最新的 OHI 结果&#xff0c;并重点介绍该指数揭示的有关领导力、数据和技术以及人才管理的一些更引人注目的见解。我们还…

数据仓库基础理论(学习笔记)

数据仓库基础理论 1.数据仓库概念 2.数据仓库为何而来 3.数据仓库主要特征 4.OLTP、OLAP系统 5.数据仓库与数据库的区别 6.数据仓库与数据集市的区别 7.数据仓库分层架构 7.1为什么要分层&#xff1f; 8.ETL、ELT

【前端】创建跳动字符效果的前端技术实现

创建跳动字符效果的前端技术实现 在前端开发中&#xff0c;动态视效能够显著增强用户体验。本文介绍一种实现字符跳动效果的技术方案&#xff0c;通过简单的HTML、CSS和JavaScript代码&#xff0c;你可以为网页文本添加生动的交互动画。这种效果可以用于吸引用户注意、增强品牌…

C语言—控制语句

控制语句就是用来实现对流程的选择、循环、转向和返回等控制行为。 分支语句 if语句 基本结构 if(表达式) { 语句块1&#xff1b; } else { 语句块2&#xff1b; } 执行顺序&#xff1a; 如果表达式判断成立&#xff08;即表达式为真&#xff09;&#xff0c;则执行语句块…

华为先进芯片麒麟9010效能再升级,挑战新高度 | 百能云芯

根据最新的彭博资讯报道&#xff0c;华为再次引领了智能手机行业的先进技术&#xff0c;其最新发布的Pura 70系列智能手机搭载了由中芯国际生产的麒麟9010高阶处理器。这一消息再次证明了华为在芯片设计和生产领域的持续创新能力&#xff0c;并且表明华为对于提升智能手机性能和…

什么是虚拟货币?

随着科技的进步&#xff0c;虚拟货币逐渐进入公众视野&#xff0c;其影响深远且复杂。本文将从专业角度分析虚拟货币的发展现状、未来趋势&#xff0c;以及面临的挑战&#xff0c;并尝试提出一些思考。 一、虚拟货币的定义与现状 虚拟货币是一种基于区块链技术的数字资产&…

从固定到可变:利用Deformable Attention提升模型能力

1. 引言 本文将深入探讨注意力机制的内部细节&#xff0c;这是了解机器如何选择和处理信息的基础。但这还不是全部&#xff0c;我们还将探讨可变形注意力的创新理念&#xff0c;这是一种将适应性放在首位的动态方法。 闲话少说&#xff0c;我们直接开始吧&#xff01; 2. 注…

Dockerfile创建Docker镜像

Dockerfile DOCKER镜像的组成 Docker 镜像的构建和使用是基于 UnionFS&#xff08;联合文件系统&#xff09;的原理。UnionFS 允许将多个目录挂载到一个虚拟文件系统下&#xff0c;并且可以对这些目录进行修改&#xff0c;这些修改会以一次提交的形式叠加在已有的文件系统层上…

CTF-WEB(MISC)

安全攻防知识——CTF之MISC - 知乎 CTF之MISC杂项从入门到放弃_ctf杂项 你的名字-CSDN博客 CTF MICS笔记总结_archpr 掩码攻击-CSDN博客 一、图片隐写 CTF杂项---文件类型识别、分离、合并、隐写_ctf图片分离-CSDN博客 EXIF&#xff08;Exchangeable Image File&#xff09;是…

笔记本电脑怎么多选删除文件?误删除文件怎么办

在日常使用笔记本电脑中&#xff0c;我们可能会遇到需要删除大量文件的情况&#xff0c;例如清理临时文件、整理文档或卸载不再需要的程序。手动一个一个地删除不仅效率低下&#xff0c;还可能遗漏某些文件。那么&#xff0c;如何在笔记本电脑上高效地进行多选删除操作呢&#…

Case中default的综合结果

在使用case语句时&#xff0c;不完备的case语句会导致Vivado综合时推断出锁存器。下面通过实例来详细看看各种情况下的综合结果&#xff1a; 1.完备的case语句 下述的verilog对应的电路结构是一个8选一的多路复用器&#xff1a; module case_test(input [2:0]sel,input data…

PostgreSQL连接拒绝如何解决和排查?

1. 服务器未运行 解决方案&#xff1a;确保 PostgreSQL 服务已启动。在 Linux 上&#xff0c;你可以使用如下命令来检查服务状态&#xff1a;sudo systemctl status postgresql如果服务未运行&#xff0c;使用以下命令启动它&#xff1a;sudo systemctl start postgresql2. Po…

【软考】模拟考卷错题本2024-05-05

1 算法 关键词&#xff1a;按照单位重量价值大优先&#xff0c;那就是1、2、3即430&#xff1b;之后的根据排除法又可以得到630&#xff1b;故C。 2 UML 序列图 上图已经基本上有解析&#xff1b;重点在于在四个选项中选正确的。根据概念排除&#xff1a;异步和同步是不一样的&…