当前位置: 首页 > news >正文

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

样例输入

5
4 3 2 1 5

样例输出

-1 4 3 2 -1
5 5 5 5 -1
-1 -1 -1 -1 1
3 2 1 -1 -1
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();
    }

}

相关文章:

  • 入剖析 Android Compose 框架的关键帧动画(keyframes、Animatable)(二十三)
  • 蓝耘云平台免费 Token 获取攻略:让创作成本直线下降 - 极致优化版
  • Maven 构建配置文件
  • 工作效率upup
  • Ubuntu20.04.6系统根目录扩容
  • JWT 鉴权常见知识点及参考答案
  • nginx代理前端请求
  • 试试智能体工作流,自动化搞定运维故障排查
  • 地平线AlphaDrive:首个基于GRPO的自动驾驶大模型,仅用20%数据,性能超越SFT 35%!
  • Spring Boot整合Spring Data JPA
  • 报错 standard_init_linux.go:228: exec user process caused: exec format error
  • epoll:Linux 高性能 I/O 多路复用技术
  • 【零基础入门unity游戏开发——unity3D篇】3D模型 —— Animation动画页签
  • 备份比赛数据【算法赛】
  • 深度学习 Deep Learning 第9章 卷积网络 CNN
  • SpringBoot3-整合WebSocket指南
  • PostgREST实现DBaaS(数据库即服务)
  • Python:多线程意义及应用场景
  • 【Git江湖秘典——禁制、心法与渡劫篇】
  • 重要重要!!fisher矩阵是怎么计算和更新的,以及计算过程中参数的物理含义
  • 央行行长详解降准:将释放长期流动性1万亿,整体存款准备金率平均水平降至6.2%
  • 巴方称印军发动24起袭击,巴境内6处地点遭袭致8人死亡
  • 《蓦然回首》:现代动画的践行与寓言
  • 上海车展侧记|中国汽车产业的韧性从何而来
  • 韩国总统选举民调:共同民主党前党首李在明支持率超46%
  • 想要“逆转”糖尿病,减少这两处脂肪是关键