单调栈个人理解总结:
1.单调栈是用来解决这一类问题:寻找数组中元素其左或者右第一个大于或小于该元素的值。
2.首先,如果要寻找其右侧,要从右向左遍历。反之,从左向右遍历。
3.如果是寻找第一个大于该元素的值,则要在栈顶保存较小的值。即从栈底到栈顶是递减的(栈顶到栈底就是递增的)。如果寻找第一个小于该元素的值,则要在栈顶保存较大的值。从栈底到栈顶是递增的。
单调栈需要明确,我们想要获得的结果。不论是维护递增栈还是递减栈,在保持顺序入栈时,我们可以获得什么;在破坏单调顺序时,我们可以获得什么。
举例说明:如果我们想要获得一个数组中,其左和右第一个小于其的元素的索引。按最初的理解,需要从左到右和从右到左分别遍历一次。但是如果继续深入考虑一下:
如果从左到右遍历,维护一个单调递增的顺序,如果正常入栈的时候,显然我们可以获取入栈元素左边第一个小于其的索引。(栈顶元素小于当前元素,如果栈为空,则说明左侧没有小于当前元素的值)当破坏了栈的单调递增顺序,显然,我们可以获取出栈元素右边第一个小于该元素的索引。综上,只需一次遍历便可同时确定。