算法标签:单调栈
题目简叙
思路
单调栈的概念是栈内所有数据都是单调递增或者递减
这里我们只需要构造一个单调递增的栈,然后反复查看栈顶,
此时的栈顶元素必然为栈内最大元素,如果栈顶比目标值大,就弹出该元素,直至栈顶元素比目标值小
这样我们栈内的元素必然是单调递增的
这样我们就可以获得左边第一个比它小的数
代码
#include<iostream>
using namespace std;
const int N = 1e5+10;
int stk[N],tt;
int main(){
int n;
cin>>n;
int tmpn=0;
while(n--){
cin>>tmpn;
while(stk[tt]>=tmpn&&tt){
tt--;
}
cout<<(tt?stk[tt]:-1)<<" ";
stk[++tt]=tmpn;
}
return 0;
}
#include<iostream>
#include<stack>
using namespace std;
stack<int> stk;
int main(){
int n;
cin>>n;
int tmpn=0;
while(n--){
cin>>tmpn;
while (!stk.empty() && stk.top()>=tmpn){
stk.pop();
}
cout<<(!stk.empty()?stk.top():-1)<<" ";
stk.push(tmpn);
}
return 0;
}