LeetCode——单调栈题型分析

〇、引入

什么是单调栈:单调栈是栈结构,但使用了一定方法让栈内元素保持单调性(单调递增或递减)。

能解决的问题:专门解决 Next Greater Element 这类典型问题。即在数组中寻找每个元素的下个更大元素。

本篇主要描述了什么是 Next Greater Element问题、单调栈的解题模板,以及它能解决的哪些衍生问题。

一、Next Greater Element

描述:

给定一个数组,返回一个等长的数组,对应索引存储着下一个更大元素,如果没有更大的元素,就存 -1。

示例:

输入:[2,1,2,4,3] 输出:[4,2,4,-1,-1] 解释: 第一个 2 后面比 2 大的数是 4; 1 后面比 1 大的数是 2; 第二个 2 后面比 2 大的数是 4; 4 后面没有比 4 大的数,存 -1; 3 后面没有比 3 大的数,存 -1。

题解:

对于上面这种类型的题最优的解决方式就是单调栈了,个人认为单调栈思想是:“暂时得不出结果的数据就入栈,等待时机到了,能得出结果时再取出来处理。”一般来说,每个元素都不可能在入栈时就能得出结果,所以每个元素都会有入栈操作,只是每个元素入栈前需要判断之前栈顶的元素是否等到了时机,只要时机到了就把之前存入栈顶的元素取出处理,而这个时机也控制着栈内元素的单调性。

比如循环示例中的数组,

遍历到下标为0的元素时,此时并不知道下个更大元素是谁,所以将当前下标入栈,栈内元素有[0],栈顶为0;

遍历到下标为1的元素时检查栈顶的元素是否等到了时机,一经比较1不大于arr[0]=2,说明栈顶元素时机并没有到,然后将当前下标入栈,栈内元素有[0,1],栈顶为1;

遍历到下标为2的元素时检查栈顶的元素是否等到了时机,一经比较2大于arr[1]=1,说明栈顶元素等到了时机,则弹出栈顶元素计算出对应的结果值 result[1]=2,之后栈内元素有[0],栈顶为0,再比较2不大于arr[0]=2,然后将当前下标入栈,栈内元素有[0,2],栈顶为2;

遍历到下标为3的元素时检查栈顶的元素是否等到了时机,一经比较4大于arr[2]=2,说明栈顶元素等到了时机,则弹出栈顶元素计算出对应的结果值 resul

你可能感兴趣的:(算法笔记,LeetCode,1024程序员节,算法,leetcode,java,数据结构)