单调栈的意义:记录(元素i从左遍历(右遍历)第一个小于或大于的元素k)下标
白话: (符合条件) 并 (距离元素i最近的元素k) 的下标
这里的符合条件是指:比元素i大,或者比元素i小
单调栈的维护意义:保证栈底f 是[0,i)区间的最小值,并且保证栈的所有元素是[0,i)的第一个最小值,第二个最小值.....
维护的核心代码:
while(!p1.empty() && t[p1.top()] >= t[i]) p1.pop();
int ml[mmax];
stack<int> p1;
for(int i = 1 ; i <= n ; i ++){
while(!p1.empty() && t[p1.top()] >= t[i]) p1.pop();
if(p1.empty()) ml[i] = 0;
else ml[i] = p1.top();
p1.push(i);
}
每个元素只能进栈一次,相应的最多也只能被弹一次,
即算法复杂度:O(N)*O(1) = O(N)
for(int i = 1 ; i<= n ; i++){
O(1) ;
}