算法原理:
用單調遞增棧,當該元素可以入棧的時候,棧頂元素就是它左側第一個比它小的元素。
以:3 4 2 7 5 為例,過程如下:
動態模擬過程
題目:
給定一個長度為 N 的整數數列,輸出每個數左邊第一個比它小的數,如果不存在則輸出 ?1。
輸入格式
第一行包含整數 N,表示數列長度。
第二行包含 N個整數,表示整數數列。
輸出格式
共一行,包含 N
個整數,其中第 i 個數表示第 i 個數的左邊第一個比它小的數,如果不存在則輸出 ?1。
數據范圍
1≤N≤105
1≤數列中元素≤109
輸入樣例:
5
3 4 2 7 5
輸出樣例:
1
-1 3 -1 2 2
#include<iostream>
using namespace std;
const int maxn = 100010;
int stk[maxn],tt;int main(){int N,k;cin>>N;while(N --){cin>>k;while(tt && stk[tt] >= k) tt--;if(!tt) cout<<"-1 ";else cout<<stk[tt]<<" ";stk[++ tt] = k;}return 0;
}