应张子渝需求,现更新一篇单调栈和单调队列。(本篇只讲单调栈,单调队列还在更新)
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
所谓单调就是指元素按递增或递减的排列方式规整地排列。
例如
> {1,2,3,4,5,61,2,3,4,5,61,2,3,4,5,6},
> {1,2,5,10,12,161,2,5,10,12,161,2,5,10,12,16},
> {9,8,7,6,1,−19,8,7,6,1,-19,8,7,6,1,−1}...
都属于按单调排列,而
> {1,2,7,4,5,61,2,7,4,5,61,2,7,4,5,6},
> {1,0,5,11,12,161,0,5,11,12,161,0,5,11,12,16},
> {9,8,17,6,1,−19,8,17,6,1,-19,8,17,6,1,−1}...
则不属于按单调排列。
单调栈
何为单调栈?顾名思义,单调栈即满足单调性的栈结构。为了方便描述,接下来以从栈底到栈顶满足递增的单调栈举例。
现有一个单调栈,里面只有一个元素 555。
接着将元素 333 压栈,因为 {3,53,53,5} 仍符合递增,所以可以直接压栈。
如果接下来还要将元素 444 压栈,因为 {4,3,54,3,54,3,5} 不符合递增关系,所以不可以直接压栈。为保证栈的单调性,需先把元素 333 弹出,再压入元素 444。
另外如果我们要弹出元素,考虑到无论怎么弹,栈始终保持单调性(此处读者可自行理解),所以可直接弹出。
所以,单调栈基本代码应是这样的:
1.例题 【模板】单调栈
题目入口
该题是模板,今后注意到像“之后第一个大于”一类的字眼,可以考虑到单调栈。
该题 AC 代码如下:
本题还可以用单调递减栈完成,现不一一展示。
其他例题(无代码,如有必要可私信,但不保证一定有讲解)
P1901 P2866 P2947 B3666 P4147
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
注:碍于ACGO题库中单调栈题太少,故上述题目均来自洛谷。并非贬低ACGO,在此对广大狗友以表歉意。另外如果需要,在下可以在ACGO上提供些单调栈的题或厚着脸皮在你谷上要版权把题目拉过来(第二种方式较困难)。