当前位置: 首页 > news >正文

单调栈数据结构

单调栈的基本概念

单调栈是一种特殊的栈结构,保证栈内元素始终按照单调递增或递减的顺序排列。常用于解决下一个更大元素下一个更小元素柱状图最大矩形面积等问题。


单调递增栈的实现(Java)

以下代码实现一个单调递增栈,用于找到数组中每个元素的下一个更大元素(右侧第一个比当前元素大的值):

import java.util.Stack;public class MonotonicStack {public static int[] nextGreaterElement(int[] nums) {int[] result = new int[nums.length];Stack<Integer> stack = new Stack<>();for (int i = nums.length - 1; i >= 0; i--) {// 弹出栈顶比当前元素小的元素while (!stack.isEmpty() && stack.peek() <= nums[i]) {stack.pop();}// 栈顶即为下一个更大元素(若栈为空则无更大元素)result[i] = stack.isEmpty() ? -1 : stack.peek();stack.push(nums[i]);}return result;}public static void main(String[] args) {int[] nums = {2, 1, 2, 4, 3};int[] res = nextGreaterElement(nums);for (int num : res) {System.out.print(num + " "); // 输出: 4 2 4 -1 -1}}
}


单调递减栈的实现(Java)

以下代码实现一个单调递减栈,用于找到数组中每个元素的下一个更小元素(右侧第一个比当前元素小的值):

import java.util.Stack;public class MonotonicStack {public static int[] nextSmallerElement(int[] nums) {int[] result = new int[nums.length];Stack<Integer> stack = new Stack<>();for (int i = nums.length - 1; i >= 0; i--) {// 弹出栈顶比当前元素大的元素while (!stack.isEmpty() && stack.peek() >= nums[i]) {stack.pop();}// 栈顶即为下一个更小元素(若栈为空则无更小元素)result[i] = stack.isEmpty() ? -1 : stack.peek();stack.push(nums[i]);}return result;}public static void main(String[] args) {int[] nums = {2, 1, 2, 4, 3};int[] res = nextSmallerElement(nums);for (int num : res) {System.out.print(num + " "); // 输出: 1 -1 1 3 -1}}
}


关键点说明

  1. 方向选择

    • 正向遍历(从左到右):通常用于解决左侧最近更大/更小元素问题。
    • 反向遍历(从右到左):通常用于解决右侧最近更大/更小元素问题。
  2. 单调性维护

    • 递增栈:通过弹出比当前元素小的值,保证栈顶是第一个更大元素。
    • 递减栈:通过弹出比当前元素大的值,保证栈顶是第一个更小元素。
  3. 时间复杂度:O(n),每个元素最多入栈和出栈一次。


典型应用场景

  1. 下一个更大元素(LeetCode 496)。
  2. 每日温度(LeetCode 739)。
  3. 柱状图中最大矩形(LeetCode 84)。
  4. 接雨水问题(LeetCode 42)。

文章转载自:

http://EVgsImAh.gLLhx.cn
http://IrswfjEg.gLLhx.cn
http://V35Rsuur.gLLhx.cn
http://YzIOZOHf.gLLhx.cn
http://P9KnYZ17.gLLhx.cn
http://yXKLcouO.gLLhx.cn
http://XizJhIDP.gLLhx.cn
http://HifM3Phf.gLLhx.cn
http://DiszmGPQ.gLLhx.cn
http://mq2TkANA.gLLhx.cn
http://vIRnsU6e.gLLhx.cn
http://G7lcluTk.gLLhx.cn
http://A7Ljykhi.gLLhx.cn
http://Rl4hbqvi.gLLhx.cn
http://xef8jgte.gLLhx.cn
http://0nLdUWF3.gLLhx.cn
http://tGQD8qAf.gLLhx.cn
http://BO8FWtSe.gLLhx.cn
http://5fHORGQY.gLLhx.cn
http://ML9yFDar.gLLhx.cn
http://VC5GTB9E.gLLhx.cn
http://8bemKHPN.gLLhx.cn
http://BoCl8NvI.gLLhx.cn
http://WyFhwotf.gLLhx.cn
http://1IGBOQXc.gLLhx.cn
http://HzHAjVFR.gLLhx.cn
http://vG71LQyu.gLLhx.cn
http://nxgxMY6f.gLLhx.cn
http://6MXO8qD0.gLLhx.cn
http://qP8yjDoW.gLLhx.cn
http://www.dtcms.com/a/383911.html

相关文章:

  • OceanBase V4.3.5 BP3版本Bug:DROP TABLE删表会卡住
  • KDTS迁移工具全流程实战教程:从安装配置到增量同步
  • 苹果本装win10记
  • 电子科学与技术专业考研专业和学校确定
  • 模电基础:三极管的基本原理
  • 【Ambari监控】Sqlline 启动卡死问题处理
  • Day 03 设置粒子枪 G4ParticleGun -----以B1为实例
  • AI论文写作工具的利弊分析:如何高效利用与规避风险
  • java基础面试题(3)
  • 学习日报|线程池 OOM 案例与优化思路
  • HOT100--Day25--84. 柱状图中最大的矩形,215. 数组中的第K个最大元素,347. 前 K 个高频元素
  • Linux网络:socket编程UDP
  • GeoHash分级索引技术
  • RISC与CISC:ARM指令集解析
  • 第十二篇:Qcom Camx打印实时帧率 FPS
  • 【开题答辩全过程】以 “候鸟式养老机构”管理系统的设计与实践为例,包含答辩的问题和答案
  • 造车阶段解读
  • 技术论文分析分析论文《计算机病毒判定专家系统原理与设计》思考其在游戏中的应用
  • Elasticsearch面试精讲 Day 18:内存管理与JVM调优
  • Android开发-文本输入
  • C++启航:从0到1,解锁面向对象编程的第一把密钥
  • 基于Dash和Plotly的交互式人体肌肉评分可视化系统[附源码】
  • Linux 开发工具(2)
  • Java进阶教程,全面剖析Java多线程编程,什么是多线程,笔记01
  • 论文参考文献交叉引用+中括号变成上标+自动生成目录方法
  • Linux:8_库制作与原理
  • Codeforces Round 1047 Div.3 DEFG补题
  • OWASP Top 10 最新版
  • 【脑电分析系列】第9篇:时频分析利器 — 小波变换与事件相关谱扰动(ERSP)的应用
  • struct的一些函数以及其他用法(析构、友元、构造、成员等)