【基础算法】单调栈

给定一个长度为N的整数数列,输出每个数左边第一个比它小的数,如果不存在则输出-1。

输入格式

第一行包含整数N,表示数列长度。

第二行包含N个整数,表示整数数列。

输出格式

共一行,包含N个整数,其中第i个数表示第i个数的左边第一个比它小的数,如果不存在则输出-1。

数据范围

1N1051≤N≤105
11091≤数列中元素≤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;
}

 

posted @ 2020-05-28 15:12  Vincent&  阅读(366)  评论(0编辑  收藏  举报