单调栈
应用场景
给定一个序列求序列中的每个元素的离它左边最近且比这个数小的数。
同理(以下均适用):
给定一个序列求序列中的每个元素的离它左边最近且比这个数大的数。
给定一个序列求序列中的每个元素的离它右边最近且比这个数小的数。
给定一个序列求序列中的每个元素的离它右边最近且比这个数大的数。
证明栈是单调的
以(给定一个序列求序列中的每个元素的离它左边最近且比这个数小的数。)为例
给定一个序列a
假设:下标x<i 且 x+2<i
如果:a[x]>=a[x+2]
那么a[x]一定可以被a[x+2]替代,因此在栈中剩下的都是严格单调上升的序列。
执行过程
令栈为stk,栈顶指针为top。
如果stk[top] <= a[i],那么栈顶元素出栈,直到stk[top] > ai。
此时stk[top]即为a[i]左边比a[i]小且离a[i]最近的数。
模板
for(int i = 0;i < n;i++){
while(!stk.empty() && stk.top() >= a[i]) stk.pop();
if(!stk.empty()) {
//找到答案
}
else{
//没有答案
}
stk.push(a[i]);
}