单调栈
算法思想:
- 常用场景:给定一个序列,求一下序列中每一个数左边(右边)离他最近的且比他小(大)的数是几
- 先以暴力做法即双重循环i,j,发现规律:在i指针往右走的同时压栈。依据原则:如果x<y并且a[x]>=a[y],那么显然a[x]不可能作为答案输出来,因为假设如果a[x]满足条件,那么a[y]则理应会先被找到。这样依据这个原则,在压栈的时候进行比较,能保证栈是严格单调递增的。
代码实现:
const int N=100010;
stack<int> st;
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
{
int x;
scanf("%d",&x);
while(!st.empty()&&st.top()>=x) st.pop();
if(st.empty()) printf("-1 ");
else printf("%d ",st.top());
st.push(x);
}
return 0;
}