算法学习笔记(14)——单调栈
单调栈
时间复杂度:\(O(N)\)
#include <iostream>
using namespace std;
const int N = 1e5 + 10;
int n;
int stk[N], tt; // 数组模拟栈,栈顶指针默认为0(空)
int main()
{
cin >> n;
while (n -- ) {
int x;
cin >> x;
// 栈不为空且栈顶元素大于x,则出栈
while (tt && stk[tt] >= x) tt --;
// 如果栈不空,输出栈顶元素
if (tt) cout << stk[tt] << ' ';
// 如果栈空,输出-1
else cout << "-1 ";
// 将新元素入栈
stk[++ tt] = x;
}
return 0;
}
单调栈借助单调性处理问题的思想在于“及时排除不可能的选项,保持策略集合的高度有效性和秩序性”,从而为我们做出决策提供更多的条件和可能方法。