使用场景:
给定一序列,求出该序列中每个数左边离他最近且比他小 / 大的数。
单调栈:栈中的数呈单调上升或下降的形式。
ex:给定一序列,求出该序列中每个数左边离他最近且比他小的数。
思路:
从头遍历该序列,当遍历到 ,如果栈顶元素 小于,则栈顶元素则为要的值。
否则,进行循环:直到小于当前的栈顶为止,并且在循环过程中将大于 的栈顶元素弹出。当前的栈顶就是要的值,然后将该遍历到的元素装入当前栈顶 。
最后,这个栈会形成一个单调上升的序列。
给定一个长度为 N 的整数数列,输出每个数左边第一个比它小的数,如果不存在则输出 −1。
输入格式
第一行包含整数 N,表示数列长度。
第二行包含 N 个整数,表示整数数列。
输出格式
共一行,包含 N 个整数,其中第 i 个数表示第 i 个数的左边第一个比它小的数,如果不存在则输出 −1。
数据范围
1≤N≤10^5
1≤数列中元素≤10^9输入样例:
5 3 4 2 7 5
输出样例:
-1 3 -1 2 2
import java.io.*;
class Main{
static int N = 100010;
static int n;
static int[] stk = new int[N];
public static void main(String[] args) throws IOException{
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
n = Integer.parseInt(in.readLine());
String[] str = in.readLine().split(" ");
int tt = 0;
for(int i=0;i<n;i++){
int x = Integer.parseInt(str[i]);
while(stk[tt]>=x) tt--; // 找到小于x的第一个值
if(tt==0) System.out.print("-1 "); // 没有,输出-1
else System.out.print(stk[tt]+" "); // 有,当前栈顶元素则是要求的值
stk[++tt] = x; // 将该值装入栈
}
}