单调栈: 找出数组中任意位置左右两边比它大的数字

C++之单调栈 单调栈的性质 单调栈是一种特殊的栈,特殊之处在于栈内的元素都保持一个单调性。 假设下图是一个栈内元素的排列情况(单调递增的栈): 此时插入情况有两种: (1)插入元素大于栈顶元素: 因为7 > 6,满足栈内元素单调递增的性质,所以可以直接插入7到栈顶 (2)当插入元素小于栈顶元素的时候,当插入3的时候,需要将栈顶的6,4弹出,在插入,例如: 功能 利用单调栈可以找出从左/右遍历第一个比... 阅读详情
  • 数据: {5 4 6 7 2 3 0 1}
  • 如4左边最大值5右边最大值是6
  • 描述:
  •         找出数组中任意位置上,左右两边比它大的数字,左右没有输出 " 无 ", 否则就打印.操作时利用栈结构实现,索引从0开始,如果栈为空直接push,不为空比对栈顶数据和要push的值,如果栈顶的小于要压入的数据,那么就弹出,一直弹出到遇到比它大的栈顶元素停止,接着push就行.需要注意的是,在push过程中由于要将遇到的小的栈内元素弹出,弹出时是需要打印信息的,因为弹出行为就是找到两边大元素的时机.
  •          原则: 弹出时,将要压入栈的大的数据就是此时弹出元素的右边最大值,弹出之前压在其下的值就是它左边比它大的值,如果它已经是栈底就代表左边没有比它大的元素. (push时如果栈顶元素比它大直接push,否则就弹栈,如上所述).
  •         当数组遍历完毕,压栈操作与部分弹栈操作已经进行,但是栈里面还有数据,此时栈内的元素小的依旧压在大的数据之上,现在的栈顶元素,就是最后入栈的数据,所以它没有右边最大值,而它的左边最大值就是它下面的元素.如果下面没有说明它也没有左边最大值. 
public class MonotonyStack {
    public static void main(String[] args) {
        //数组不存在重复值
        int[] arr = {5, 4, 6, 7, 2, 3, 0, 1};
        maxOfTwoSide(arr,0);
    }

    //打印所有位置左右比它大的数据
    public static void maxOfTwoSide(int[] arr,int next){
        Stack<Integer> stack = new Stack<>();
        while(next < arr.length){
            if(stack.isEmpty()){
                stack.push(next);
            }else{
                while (!stack.isEmpty()){
                    if(arr[stack.peek()] < arr[next]){
                        int cur = stack.pop();
                        int pre = -1;
                        if(!stack.isEmpty()){
                            pre = stack.peek();
                        }
                        if(pre == -1){
                            System.out.println("左边:\t无" + "\t当前值:\t" + arr[cur] + "\t右边:\t" + arr[next]);
                        }else{
                            System.out.println("左边:\t" + arr[pre] + "\t当前值:\t" + arr[cur] + "\t右边:\t" + arr[next]);
                        }
                    }else{
                        stack.push(next);
                        break;
                    }
                }
                if(stack.isEmpty()){
                    stack.push(next);
                }
            }
            next ++;
        }
        while (!stack.isEmpty()){
            if(stack.size() > 1){
                int cur = stack.pop();
                System.out.println("左边:\t" + arr[stack.peek()] + "\t当前值:\t" + arr[cur] + "\t右边:\t无");
            }else{
                int cur = stack.pop();
                System.out.println("左边:\t无" + "\t当前值:\t" + arr[cur] + "\t右边:\t无");
            }
        }
    }
}

以数组 {5 4 6 7 2 3 0 1} 为例,测试结果如下:  左边 右边 分别代表 "左/右边最大值"

  左神算法学习

EndNote X9 参考文献附录列表 格式调整 EndNote X9 插入参考文献常见问题总结 阅读详情

相关推荐

Springer期刊LaTeX模板中参考文献格式选择与编译错误的快速修复指南

本文针对Springer期刊LaTeX模板中参考文献编译后显示问号的常见问题,提供了快速修复指南。核心在于正确选择并配置与期刊匹配的参考文献格式文件(.bst),并执行标准的四步编译流程。文章详细解释了问题根源,并给出了从查找正确.bst文件到修改代码、执行编译的完整解决方案,帮助作者高效解决投稿中的技术障碍。

weixin_29266007的博客 402

面试题:在数组里查找这样的数,它大于(等于)左侧所有数,小于(等于)右侧所有数

面试题:在数组里查找这样的数,它大于(等于)左侧所有数,小于(等于)右侧所有数

活到老,学到老~ 609

ABAP内表数据导出Excel:OLE、ALV与GUI_DOWNLOAD方案全解析

在企业级应用开发中,数据导出是连接后台系统与前端业务分析的关键桥梁。其核心原理是将结构化数据转换为通用文件格式,以实现跨平台的数据交换与可视化。从技术价值看,一个健壮的导出功能能显著提升数据处理效率,减少人工干预,是衡量系统实用性的重要指标。常见的应用场景包括报表生成、数据交接和临时数据提取。本文聚焦于SAP ABAP开发领域,深入探讨如何将内表数据高效、稳定地导出至Excel,涵盖了OLE自动化、ALV标准导出以及基于CL_GUI_FRONTEND_SERVICES与GUI_DOWNLOAD的通用方案,并

weixin_32715349的博客 324

数组--二维数组中的查找

题目描述: 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 思路: 从左下角元素往上查找,右边元素是比这个元素大,上边是的元素比这个元素小。于是,target比这个元素小就往上找,比这个元素大就往右找。如果出了边界,则说明二维数组中不存在target元素...

qq_turn 265

华为路由器 VRRP主备配置

3、R3 出口路由器。

一直被模仿,从未被超越 5586

【PowerHarmony】电鸿蒙学习记录-准备工作

将获取的“PowerHarmony_PHM_SDK_V1.0.1.0.tar.gz”进行解压。将获取的“code_1.91.1-1720564633_amd64.deb”进行解压。打开后可见所有文件夹,即可进行编辑开发,VSCode也可打开终端进行编译等调试。选择主控类型,我是用的是gd32f470,我选gd32f4xx。Open Folder路径选中SDK解压后根目录即可。选择对应系统类型,我的是小型的,我选mini。选好后即完成工程创建。

Allenzhu的博客 2730

牛客网 18 二维数组中的查找

这一题其实也没啥好说的,就是一个走迷宫的问题。1.从左下开始走,对于上方元素比他小,对于右方元素比他大,官网经典思路。

qq_41696858的博客 414

Calibre PEX提取HSPICE网表时如何避免‘net 0‘错误?实测解决方案分享

本文详细解析了Calibre PEX提取HSPICE网表时出现的'net 0'错误,提供了从规则文件修改到网表后处理的四步解决方案。通过实战案例和进阶调试技巧,帮助工程师有效避免节点映射错误,确保后仿真精度。特别针对SPICE netlist生成机制提出了优化建议。

weixin_29279153的博客 387

找出数组中的一个数,在该数的左边他是最大的,在该数的右边他是最小的。如何求这个数

首先。假设数组为nums[] = {1, 4 3, 6, 8,10}。很明显可以看出 6、8大于左边所有数缺小于右边所有数。那如果用代码表示思路是怎么样子的? 我们可以开一个leftmax数组和一个rightmin数组。分别用来存放左边的最大值和右边的最小值 nums[] = {1,4,3,6,8,10} leftmax[] = {1,4,4,6,8,10} // leftmax[0] = nums[0] leftmax[i] = max(leftmax[i-1], nums[i]) i++

weixin_51993595的博客 848

正点原子stm32f103RChal库制作数字秒表:如用keil5和正点原子STM32F1开发板实现?

🏆本文收录于 《全栈Bug调优(实战版)》 专栏,该专栏专注于分享我在真实项目开发中遇到的各类疑难Bug及其深层成因,并系统提供高效、可复现的解决思路和实操方案。无论你是刚入行的新手开发者,还是拥有多年项目经验的资深工程师,本专栏都将为你提供一条系统化、高质量的问题排查与优化路径,助力你加速成长,攻克技术壁垒,迈向技术价值最大化与职业发展的更高峰🚀!    📌 特别说明: 文中部分技术问题来源于真实生产环境及网络公开案例,均经过精挑细选与系统化整理,并结合多位一线资深架构师和工程师多年实战经验沉淀,提

**My Coding Family** 1264

Spring AI Alibaba 1.x 源码分析-架构设计

本文通过分析Spring AI Alibaba 框架的源码,分析出其原理和架构设计,无论是用于项目开发、技术评估还是团队培训都具有重要价值。

program哲学 490

计算数组中每个数左边/右边第一个比其大/小的值 python

计算数组中每个数左边第一个比其大的值 如果用最简单的暴力法,时间复杂度最坏情况下 O(n^2),遍历每一个数,再遍历它的两边 arr = [5,2,4,9,3,1,5,7,8,6,1,3,5,5] stack = [] n = len(arr) leftFirstMax = [None]*n rightFirstMax = [None]*n for i in range(n): p = i-1 ...

jianyuchen23的博客 2669

HQChart实战教程49-点击修改K线颜色及背景色

HQChart实战教程49-点击修改K线颜色及背景色需求效果图步骤1. 注册点击监听事件2. 修改K颜色添加一个自定义颜色的K线klineoption清空所有自定义颜色的K线option交流QQ群: 950092318HQChart代码地址完整例子 需求 对点击的K线修改颜色。 效果图 步骤 1. 注册点击监听事件 事件ID JSCHART_EVENT_ID.ON_CLICK_CHART_PAINT, 注册监听事件见教程 HQChart使用教程5- K线图控件操作函数说明 this.Create=func

小银 2911

单调栈算法以及相关练习

/(cur-left)*(i-cur)得到区间的组合数 * 这些区间的最小值。while (r>0 && temperatures[i]>temperatures[stack[r-1]]){ //stack[r-1]就是查看栈顶的值但是不对栈进行操作。while ( r>0&& arr[stack[r-1]]>=arr[i]){//如果栈顶的值大于等于当前值,就让栈顶出栈并结算。// (cur位置的高度-Max{left位置的高度,i位置的高度}) * ((i-left-1)*(i-left)/2)

chengxuweishao的博客 1076

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

51.【必备】单调栈-上

本文的网课内容学习自B站左程云老师的算法详解课程,旨在对其中的知识进行整理和分享~

XY_StarField的博客 1815

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

算法通关--单调栈

单调栈是在栈的先进后出的规则基础上,要求从栈底到栈顶的元素满足单调的关系。如果是大压小,那么从栈顶观察是递减栈,如果是小压大,那么从栈顶观察使递减栈。

2301_79985750的博客 1036

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

算法日记 39 day 单调栈

单调栈

weixin_70808146的博客 1040

【Leetcode刷题笔记】 单调栈

最近刷题的时候碰到很多单调栈的问题,特此记录下来,省的以后全忘了。 单调栈问题都有一个特点,就是大多数的栈存的并不直接是元素,而是下标,通过下标去做判断。 单调栈,顾名思义就是栈内存储的元素是非递增或者是非递减的,方便进行遍历 Q1 LeetCode739 每日温度 请根据每日 气温 列表 temperatures ,重新生成一个列表,要求其对应位置的输出为:要想观测到更高的气温,至少需要等待的天数。如果气温在这之后都不会升高,请在该位置用 0 来代替。 示例 1: 输入: temperatures = [

Juvenile_chi的博客 8535

左神系列|单调栈的思想以及场景应用

单调栈 单调栈是什么? 单调栈就是一个栈结构,里面存放的内容从上到下是依次递增或者递减的。它可以用来解决在一个数组中找出每个元素对应左右两部分比自己小的值并且最近的值的情况。并且保证时间复杂度在O(n) 思想是什么? 给定一个数组,在遍历数组的过程中,我想把数组中元素对应的索引放入到单调栈中,怎么放呢?我们来捋下思路: 在数组中不出现重复数字的时候: 遍历到当前元素的时候,判断单调栈是否为空,如果为空,就将元素放入到单调栈中。如果不为空,需要判断栈顶元素和当前元素的大小,如果栈顶元素比当前元素大,那么就需

MarkusZhang的博客 1614

单调栈常用算法

单调栈算法

qq_63523553的博客 999

0栈/数组 NC157 单调栈

NC157 单调栈 描述 给定一个长度为 nn 的可能含有重复值的数组 arrarr ,找到每一个 ii 位置左边和右边离 ii 位置最近且值比 arr_iarr i小的位置。 请设计算法,返回一个二维数组,表示所有位置相应的信息。位置信息包括:两个数字 LL 和 RR,如果不存在,则值为 -1,下标从 0 开始。 解法一:单调栈 两次使用单调栈,分别求取每个值左右两侧最近的小于它的值的下标。 栈保存的不是值nums[i],而是值nums[i]的下标i。 求取的小于它的值的坐标,所以单调栈应该是递增的单调

31楼下小黑的博客 313

算法题总结(十八)——单调栈

单调栈与图论 单调栈解决的问题 通常是一维数组,要寻找任一个元素的右边或者左边第一个比自己大或者小的元素的位置,此时我们就要想到可以用单调栈了。时间复杂度为O(n)。 单调栈的本质是空间换时间,更直白来说,就是用一个栈来记录我们遍历过的元素,因为我们遍历数组的时候,我们不知道之前都遍历了哪些元素,以至于遍历一个元素找不到是不是之前遍历过一个更小的,所以我们需要用一个容器(这里用单调栈)来记录我们遍历过的元素。 单调栈里存放的元素是什么? 单调栈里只需要存放元素的下标i就可以了,如果需要使用对应的元素,直接T

maruofan666的博客 1100

C++ 单调栈

当题目给出一维数组,且要求我们求出数组元素的左边或者右边第一个比自己大或者比自己小的数组元素的下标或者数组元素本身的时候。注意,这里就有四种情况:左边比自己大,左边比自己小,右边比自己大,右边比自己小。

m0_59680769的博客 1279

单调栈结构

问题引出 单调栈是这样一类结构,栈中的元素有序,例如一个单调递增栈,如果新来的元素比栈顶更大,那么入栈;如果新来的元素比栈顶更小,那么弹出若干栈顶元素,直到新来的元素能够入栈 单调栈经典问题:条形图的最大矩形面积 该问题,维护一个单调递增栈,如果新来的元素比栈顶小,那么开始一个count计数弹出。不断计算矩形面积:count*stack.top() 即使每次的矩形是top高度×当前矩形的长(count计数)。同时弹出count个元素,重新压入count+1个新元素(新元素使得前面部分减少:短板效

一只老风铃 453

单调栈和单调队列及其数组实现——Java版

1. 介绍单调栈/单调队列的应用场景; 2. 使用数组实现单调栈/单调队列,提高对数据结构的理解并提升效率

chuangshangbeidong的博客 3305

算法学习打卡day47|单调栈系列题目

对于每个 0

weixin_45124219的博客 1366
上一篇: 滑动窗口 (双端队列实现)
下一篇: 二叉树的前序,中序,后序的遍历(非递归/递归实现)
_nohave
博客等级 码龄10年 82粉丝 83原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值