给定一个长度为 N 的整数数列,输出每个数左边第一个比它小的数,如果不存在则输出 −1。
输入格式 第一行包含整数 N,表示数列长度。
第二行包含 N 个整数,表示整数数列。
输出格式 共一行,包含 N 个整数,其中第 i 个数表示第 i 个数的左边第一个比它小的数,如果不存在则输出 −1。
数据范围
1≤N≤105
1≤数列中元素≤109
输入样例
5
3 4 2 7 5
输出样例
-1 3 -1 2 2
代码
模拟单调栈
//数组模拟
#include<bits/stdc++.h>
using namespace std;
const int N = 100010;
int n;
int stk[N] ,tt;//tt相当于指针
int main(){
cin >> n;
for(int i = 0; i < n; i++){
int x;
cin >> x;
while (tt && stk[tt] >= x) tt--;//tt不为0,而且模拟栈顶大于x,指针下移
if(tt) cout << stk[tt] << " ";//找到那个刚好小于x的,输出
else cout << -1 << " ";//否则输出-1
stk[++ tt] = x;//然后压入栈中
}
return 0;
}
单调栈
#include<bits/stdc++.h>
#include<algorithm>
using namespace std;
const int N = 100010;
int q[N], n;
stack<int > num;
int main(){
cin >> n;
for(int i = 0; i < n; i++)
{ cin >>q[i];
//第一个肯定要输出-1,而且要进栈
if(i == 0 ){
printf("-1 ");
num.push(q[i]);
//如果栈顶元素小于要q[i],输出栈顶元素,然后压栈
}else if(num.top() < q[i]){
printf("%d ", num.top());
num.push(q[i]);
}else {
while(num.top() >= q[i]){
num.pop();
if(num.empty()) break;//栈为空的话,跳出循环
} if(num.empty()) printf("-1 ");//栈为空的话,打印-1
else printf("%d ", num.top());//如果栈不是空,那么输出栈顶元素
num.push(q[i]); //再压入新元素
}
}
return 0;
}