一、题干:acwing单调栈
二、思路
首先让我们想一下暴力该怎么做,当然是要用两层循环啦。
第一层循环遍历数列,第二层循环从后往前遍历已经完成过第一次遍历的整数,直到找到一个小于当前这个数的数并将其输出。
可以发现,有些数一定不会是答案。例如 1 4 3 x 5 这个数列,让我们来看第四个数左边第一个比他小的数是什么,在这里我们将第四个数设成x是为了推广出更通用的结论。
如果x大于3,那么答案就是3;如果x大于4,答案依然是3;如果x大于1,那么1、3都有可能,为什么4没有可能呢,因为如果4比x小,3一定小,输出答案。
由此可知,这道题我们可以用栈来保存已经遍历过的数,同时保证栈内元素单调递增,那么栈顶元素就一定是小于当前元素的第一个数。
三、代码实现
#include<iostream>
using namespace std;
const int N = 1e5 + 10;
int d[N], tt = 0;
int main()
{
int n;
cin>>n;
int a;
while(n--)
{
cin>>a;
while(tt != 0 && a <= d[tt])
{
tt --;
}
if(tt == 0) cout << "-1 ";
else cout<<d[tt]<<' ';
d[++ tt] = a;
}
return 0;
}