思路
脑中有图,心中不慌
核心便是让栈顶始终为该元素前面距离他最近的比他小的数
栈刚好可以做到这一点,
首先将第一个数入栈, 此时栈中只有一个数,即第一个之前没有比他小的数,所以将自己本身入栈
然后后面的推论便具有普适性了,在push 第 k 个元素时,从栈顶开始比较,如果栈顶元素比第k个元素大,则出栈,否则找到距离第k个元素最近的元素,然后将第k个元素入栈。
即无论怎样,每一个元素都必须要入栈一次才可以
C++ 代码
#include <iostream>
using namespace std;
const int N = 100010;
int q[N],stk[N],top;
int main(){
int n;
cin >> n;
for(int i = 0;i < n;++i){
cin >>q[i];
while(top && stk[top] >= q[i]) --top;
if(!top) cout << -1 << " ";
else cout << stk[top] << " ";
stk[++top] = q[i];
}
return 0;
}