#include <bits/stdc++.h>
using namespace std;
int n;
int main()
{
cin>>n;
stack<int> st;
for(int i=0;i<n;i++)
{
int x;
cin>>x;
while(!st.empty() && st.top()>=x)
{
st.pop();
}
if(st.empty())
{
cout<<-1<<" ";
}
else
{
cout<<st.top()<<" ";
}
st.push(x);
}
return 0;
}
找数组中每个数的左边离它最近且小于它的目标值
暴力方法是定一个i,然后j=i-1往前遍历,用单调栈优化,我们用一个栈来保存可能的目标值,
这样我们只需要搜索这个栈而不需要再次遍历,怎么维护这个栈?
往栈中插入x这个数,对于下一个要找目标值的数来说x是离他最近的,那么在栈中比x大的数一定不会是最后要的目标值,所以直接去掉
对于时间复杂度优化,如果是有序数组那效果不大,如果是逆序越多优化越大