单调栈
概念
首先,栈是一种数据结构,特点是先进后出,只有顶部可以进出。
单调栈是栈的元素按照他们的位置关系,满足一定单调性的栈。
+++
例题
- 给定n个数的数组a,定f(i)是a[i] 左边第一个小于a[i]元素的下标,若不存在,则f(i)为0,求出所有数的f(i)。
- 这是单调栈应用的经典问题,因为要找左边第一个小于自己的元素,假如我们为下标为i的元素寻找f(i)那么我们可以有一个想法就是每次将元素收入栈的时候都把前面比他大的元素弹出栈,这样子,每次栈顶存的元素下标就是当前i元素的f(i)。
- 时间复杂度O(n)。
板子
void solve()
{
int n;
cin>>n;
stack<int> st;
vector<int> a(n+1),f(n+1);
for(int i=1;i<=n;i++)
{
cin>>a[i];
while(!st.empty()&&a[st.top()]>=a[i])//根据不同的题目条件维护不同的单调栈
{
st.pop();//不满足条件的弹出
}
if(!st.empty()) f[i]=st.top();//若前面有符合条件的元素,则使用
else f[i]=0;
st.push(i);//当前元素入栈
}
for(int i=1;i<=n;i++) cout<<f[i]<<endl;
}