单调栈问题解析

1|0单调栈是什么

单调栈就是一个简单的栈,只不过运用了一些巧妙的逻辑,使得每次元素入栈后都保持这有序递增(或者递减),用来处理一种典型问题Next Greater Element

2|0比如求[2,1,2,4,3]的Next Greater Element,不存在设置-1

结果是:[4,3,4,-1,-1]

3|0场景想象

想象成一些人拍好一列,让你找出某个人后面比他大的是谁

4|0代码实现

public class DandiaoStack { public static void main(String[] args) { int[] ans = nextGreater(new int[]{2, 1, 2, 4, 3}); for (int an : ans) { System.out.print(an + " "); } } //求一个数组中每个元素的 比它大的下个元素,没有设置-1 public static int[] nextGreater(int nums[]) { //初始化结果数组和栈 int[] ans = new int[nums.length]; Stack<Integer> stack = new Stack<>(); //倒着把元素放进去 for (int i = nums.length - 1; i >= 0; i--) { //放之前判断和栈顶元素的大小关系 while (!stack.empty() && nums[i] >= stack.peek()) { //如果栈顶元素小于要放的元素,把栈顶元素都弹出 stack.pop(); } //弹出以后判断栈是否为空,如果为空设置-1,如果不为空设置为栈顶元素(此时栈顶元素就是下一个比他大的) ans[i] = stack.isEmpty() ? -1 : stack.peek(); //最后入栈 stack.push(nums[i]); } return ans; } }

5|0时间复杂度分析

分析它的时间复杂度,要从整体来看:总共有 n 个元素,每个元素都被 push 入栈了一次,而最多会被 pop 一次,没有任何冗余操作。所以总的计算规模是和元素规模 n 成正比的,也就是 O(n) 的复杂度。


__EOF__

本文作者程序员小宇
本文链接https://www.cnblogs.com/treasury/p/12751086.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   程序员小宇  阅读(200)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示