【基础算法】单调栈
给定一个长度为N的整数数列,输出每个数左边第一个比它小的数,如果不存在则输出-1。
输入格式
第一行包含整数N,表示数列长度。
第二行包含N个整数,表示整数数列。
输出格式
共一行,包含N个整数,其中第i个数表示第i个数的左边第一个比它小的数,如果不存在则输出-1。
数据范围
1≤N≤1051≤N≤105
1≤数列中元素≤1091≤数列中元素≤109
输入样例:
5
3 4 2 7 5
输出样例:
-1 3 -1 2 2
个人理解:
这个题首先用朴素写法先写出一个大概的框架,两个for循环,一个向后访问,一个向前寻找小于他的 数字。
然后进行优化,第二重循环里面有没有根本就用不到的值呢?当我们的a[i] >= a[j] ,i < j 的时候,a[i]根本就用不到了,因为如果选了a[i]必定可以选a[j] 所以a[i]可以去掉,去掉之后,就会发现我们的数组中的值是单调递增的,也就形成了我们的单调栈算法。
代码:
#include<iostream> using namespace std; const int N = 100010; int stk[N], tt; int main() { int n, x; cin >> n; for (int i = 0;i < n;i++) { cin >> x; while (tt && stk[tt] >= x) tt--; if (tt) cout << stk[tt] << ' '; else cout << -1 << ' '; stk[++tt] = x; } return 0; }