单调栈
单调栈是指栈里面的元素是「递增」或者「递减」的。
单调栈的应用场景
找到数组中每个元素左右第一个比他大的数
例如,数组是 [2, 4, 3, 1]
。
- 元素
2
,左边没有比他大的数,右边比他大的数是4
- 元素
4
,左右都没有比他大的数 - 元素
3
,左边比他大的数是4
,右边没有比他大的数 - 元素
1
,左边比他大的数是3
,右边没有比他大的数
「递增栈」可以找到元素左右第一个比他小的数;
「递减栈」可以找到元素左右第一个比他大的数;
例如,为了找到 [2, 4, 3, 1]
中每个元素左右比他大的数,构造「递减栈」:
2
入栈:由于栈里面没有其他元素,因此2
左边没有比他大的元素2
出栈,4
入栈:可知2
右边比他大的元素是4
,由于4
是栈底元素,因此4
的左边没有比他大的元素3
入栈:栈里面还有4
,因此3
左边比他大的元素是4
1
入栈:栈的下方还有3
,因此1
左边比他大的元素是3
- 最后,
4, 3, 1
都没有出栈,因此没有这三个元素右边都没有比他大的
注:
- 无法用「递增栈」找出元素右边比他大的值,例如
[**3**, 2, 5]
中的3
- 无法用「递增栈」找出元素左边比他大的值,例如
[4, 2, **3**]
中的3
- 无法用「递减栈」找出元素右边比他小的值,例如
[**3**, 4, 1]
中的3
- 无法用「递减栈」找出元素左边比他小的值,例如
[2, 5, **3**]
中的3