单调栈(数组模拟)

题目链接:https://www.acwing.com/problem/content/832/
题意:给定一个长度为N的整数数列,输出每个数左边第一个比它小的数,如果不存在则输出-1。
数据范围
1≤N≤1e5
1≤数列中元素≤1e9
输入样例:
5
3 4 2 7 5
输出样例:
-1 3 -1 2 2
思路:对于这种题显然是可以暴力解决的,但要是想要优化一下就得思考一下。本题的意思是找到离某个数a[z]最近的左边的小于它的数;那么这里面就有个关系了:可以用一个栈来存这些左边的数,若x < y < z,且a[x] >= a[y] , a[x] <= a[z] , a[y] <= a[z] ;那么a[x]便永远不会用上,那么这个栈就是严格递增的数列了,这样已处理显然时间复杂度就降了很多。
代码实现:

#include<iostream>
using namespace std;
const int N = 1e5 +5;
int n;
int stk[N], tt;
int main()
{
    cin >> n;
    while(n -- ){
        int x;
        cin >> x;
        while(tt && stk[tt] >= x) tt -- ;
        if(tt) cout << stk[tt] << " ";
        else cout << -1 << " ";
        stk[ ++ tt] = x;
    }
    return 0;
}

发布了61 篇原创文章 · 获赞 0 · 访问量 962

猜你喜欢

转载自blog.csdn.net/Satur9/article/details/104083135