單調棧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<iostream>
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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章