单调栈(思路+示例)

文章介绍了如何用单调栈解决寻找数列中每个数左侧第一个较小数的问题,涉及输入读取、栈操作和输出格式。
摘要由CSDN通过智能技术生成

使用场景:

        给定一序列,求出该序列中每个数左边离他最近且比他小 / 大的数。

单调栈:栈中的数呈单调上升或下降的形式。

ex:给定一序列,求出该序列中每个数左边离他最近且比他小的数。

思路:

        从头遍历该序列,当遍历到 a[i] ,如果栈顶元素 st[top] 小于a[i],则栈顶元素st[top]则为要的值。

        否则,进行循环:直到a[i]小于当前的栈顶为止,并且在循环过程中将大于a[i] 的栈顶元素弹出。当前的栈顶就是要的值,然后将该遍历到的元素a[i]装入当前栈顶 st[++top] = a[i] 。

        最后,这个栈会形成一个单调上升的序列。

给定一个长度为 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; // 将该值装入栈
        }
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值