JAVA 单调栈习题解析

单调栈

问题描述

给定一个长度为 NN 的序列 aa

第一行输出每个数字其左边 第一个比其 的数字,不存在则输出 -1

第二行输出每个数字其右边 第一个比其 的数字,不存在则输出 -1

第三行输出每个数字其左边 第一个比其 的数字,不存在则输出 -1

第四行输出每个数字其右边 第一个比其 的数字,不存在则输出 -1

update:本题数据于 2025-01-13 加强至 2×1052×105,以杜绝暴力通过。

输入格式

第一行输入一个正整数 NN 。(1≤N≤2×105)(1≤N≤2×105)

第二行输入 NN 个正整数,表示序列 aa 。(1≤ai≤105,1≤i≤N)(1≤a**i ≤105,1≤iN)

输出格式

第一行输出每个数字其左边 第一个比其 的数字,不存在则输出 -1

第二行输出每个数字其右边 第一个比其 的数字,不存在则输出 -1

第三行输出每个数字其左边 第一个比其 的数字,不存在则输出 -1

第四行输出每个数字其右边 第一个比其 的数字,不存在则输出 -1

样例输入

text 复制代码
5
4 3 2 1 5

样例输出

text 复制代码
-1 4 3 2 -1
5 5 5 5 -1
-1 -1 -1 -1 1
3 2 1 -1 -1
java 复制代码
import java.util.*;

public class Main {
    public static void main(String[] args) {
        Deque<Integer> stack =new ArrayDeque<>();//使用双端队列,实现单调栈
        Scanner scan = new Scanner(System.in);
        int n = scan.nextInt();
        int[] array = new int[n];
        for(int i=0;i<n;i++) {
            array[i] = scan.nextInt();
        }
        int[] leftbigger = new int[n];
        int[] rightbigger = new int[n];
        int[] leftsmaller = new int[n];
        int[] rightsmaller = new int[n];

        Arrays.fill(leftbigger,-1);
        Arrays.fill(rightbigger,-1);
        Arrays.fill(leftsmaller,-1);
        Arrays.fill(rightsmaller,-1);

        for(int i=0;i<n;i++) {
            while(!stack.isEmpty() && array[stack.peek()]<=array[i]){//保证stack里存的是大的,不是就要pop出来。
                stack.pop();
            }
            if(!stack.isEmpty()) {
                leftbigger[i] = array[stack.peek()];
            }

            stack.push(i);

        }
        stack.clear();

        for(int i=n-1;i>=0;i--) {
            while(!stack.isEmpty()&&array[stack.peek()]<=array[i]){//保证stack里存的是大的,不是就要pop出来。
                stack.pop();
            }
            if(!stack.isEmpty()) {
                rightbigger[i] = array[stack.peek()];
            }

            stack.push(i);

        }
        stack.clear();

        for(int i=0;i<n;i++) {
            while(!stack.isEmpty()&&array[stack.peek()]>=array[i]){//保证stack里存的是小的,不是就要pop出来。
                stack.pop();
            }
            //刚开始栈为空
            if(!stack.isEmpty()) {
                leftsmaller[i] = array[stack.peek()];
            }

            stack.push(i);

        }
        stack.clear();

        for(int i=n-1;i>=0;i--) {
            while(!stack.isEmpty()&&array[stack.peek()]>=array[i]){//保证stack里存的是xiao的,不是就要pop出来。
                stack.pop();
            }
            if(!stack.isEmpty()) {
                rightsmaller[i] = array[stack.peek()];
            }

            stack.push(i);

        }
        stack.clear();



       display(leftbigger);
        display(rightbigger);
        display(leftsmaller);
        display(rightsmaller);

        scan.close();
    }
    private static void display(int[] array) {
        for(int i=0;i<array.length;i++) {
            System.out.print(array[i]+" ");
        }
        System.out.println();
    }

}
相关推荐
恣艺2 分钟前
Python 游戏开发与文件处理:PyGame + Turtle + openpyxl + python-docx + PyPDF2
开发语言·python·pygame
爱编程的小新☆3 分钟前
JAVA实现Manus智能体
java·react·cot·智能体·spring ai·manus·agent loop
用户3721574261356 分钟前
Java 如何插入和删除 Excel 行和列
java
@SmartSi8 分钟前
AgentScope Java 入门:如何使用 OpenAIChatModel 集成兼容 OpenAI 协议模型
java·agentscope
高林雨露9 分钟前
kotlin 相关code
开发语言·kotlin
我还记得那天12 分钟前
函数的递归调用
c语言·开发语言·visualstudio
zhangfeng113313 分钟前
ThinkPHP5 事件系统的标准最佳实践 事件系统的完整设计逻辑tags.php tags.php(事件地图)
android·开发语言·php
xyq202416 分钟前
HTML 标签简写及全称
开发语言
tongluowan00717 分钟前
数据结构 Bitmap(位图)示例 - 用户签到系统
开发语言·数据结构·bitmap·用户签到系统
就叫_这个吧17 分钟前
Java线程池应用的四种方式+线程池底层实现原理
java·开发语言