单调栈1

题目描述

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

输入格式

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

输出格式

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

数据范围

1≤N≤105
1≤数列中元素≤109

输入样例:

5
3 4 2 7 5

输出样例:

-1 3 -1 2 2

单调栈: 一种具有单调性的栈
如何插入元素:
1.若插入的元素比栈顶的元素大,直接插入并不会影响单调性,所以直接进栈就好
2.插入的元素比栈顶的元素小,为了满足栈的单调性,需要弹出栈顶元素,一直找到小于该元素的值,进栈即可。
用途: 利用单调栈,可以找到从左/右遍历第一个比它小/大的元素的位置
优点:及时排除了不可能的选项, 保证了策略集合的有效性和秩序性

代码如下:

#include
using namespace std;
const int N = 1e5 + 10;
int a[N], st[N];
int main()
{
    int n, k = 0;
    cin >> n;
    for(int i = 0; i < n; i++)
        cin >> a[i];
    for(int i = 0; i < n; i++){
        while(k && st[k] >= a[i])k--; //保持栈的单调性
        if(k == 0)cout << -1 << ' ';
        else cout << st[k] << ' ';  //找到第一个比该元素小的数
        st[++k] = a[i];  //进栈
    }
    return 0;
}

你可能感兴趣的:(数据结构与算法题解总集)