〇、引入
什么是单调栈:单调栈是栈结构,但使用了一定方法让栈内元素保持单调性(单调递增或递减)。
能解决的问题:专门解决 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