原题链接:活动 - AcWing
目录
1. 题目描述
给定一个长度为 N 的整数数列,输出每个数左边第一个比它小的数,如果不存在则输出 −1。
输入格式
第一行包含整数 N,表示数列长度。
第二行包含 N 个整数,表示整数数列。
输出格式
共一行,包含 N 个整数,其中第 i 个数表示第 i 个数的左边第一个比它小的数,如果不存在则输出 −1−1。
数据范围
1≤N≤10^5
1≤数列中元素≤10^9
输入样例:
5
3 4 2 7 5
输出样例:
-1 3 -1 2 2
2. 思路分析
数组模拟单调栈。
直接暴力二重循环判断必然超时,所以需要使用单调栈O(N)进行优化
3. 代码实现
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
const int N = 1e5 + 10;
int stk[N], tt;
signed main() {
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int n; cin >> n;
for (int i = 0; i < n; i++) {
int x; cin >> x;
while (tt && stk[tt] >= x) tt--;
cout << (tt ? stk[tt] : -1) << " ";
stk[++tt] = x;
}
return 0;
}