題目描述
給定一個長度爲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;
}