Java算法真题详解运用单调栈

Java算法真题详解运用单调栈攻略

1. 什么是单调栈

单调栈是指栈中元素单调递增或递减的栈。

单调栈在算法中的应用比较广泛,经常用来解决类似于比当前数大的第一个数、比当前数小的第一个数等等问题。

2. 单调栈解法

单调栈的解法分为两类:单调递增栈单调递减栈。具体的应用方式如下:

2.1. 单调递增栈

单调递增栈指栈中元素单调递增,栈底元素最小。

单调递增栈的应用场景:

  • 求某个数右侧第一个比它大的数/位置
  • 求某个数左侧第一个比它大的数/位置

示例:对于数组 nums=[4,3,5,2,1,6],求每个数右侧第一个比它大的数。

代码实现:

public int[] nextGreaterElement(int[] nums) {
    int n=nums.length;
    int[] res=new int[n];
    Arrays.fill(res,-1);  // 先将结果数组都赋值为-1
    Deque<Integer> stack=new LinkedList<>();  // 定义单调递增栈

    for(int i=0;i<n;i++){
        // 栈不为空且当前数大于栈顶元素,则出栈并记录答案
        while(!stack.isEmpty()&&nums[stack.peek()]<nums[i]){
            res[stack.pop()]=nums[i];
        }
        stack.push(i);  // 当前数入栈
    }
    return res;
}

上述代码中,我们使用一个栈来存储每个数的下标。从左往右遍历数组,对于每个数,我们不断地弹出栈顶元素并更新答案,直到当前数的大小大于栈顶元素。最后,我们将当前数入栈。

2.2. 单调递减栈

单调递减栈指栈中元素单调递减,栈底元素最大。

单调递减栈的应用场景:

  • 求某个数左侧第一个比它小的数/位置
  • 求某个数右侧第一个比它小的数/位置

示例:对于数组 nums=[4,3,5,2,1,6],求每个数左侧第一个比它小的数。

代码实现:

public int[] nextSmallerElement(int[] nums) {
    int n=nums.length;
    int[] res=new int[n];
    Arrays.fill(res,-1);  // 先将结果数组都赋值为-1
    Deque<Integer> stack=new LinkedList<>();  // 定义单调递减栈

    for(int i=n-1;i>=0;i--){
        // 栈不为空且当前数小于栈顶元素,则出栈并记录答案
        while(!stack.isEmpty()&&nums[stack.peek()]>nums[i]){
            res[stack.pop()]=nums[i];
        }
        stack.push(i);  // 当前数入栈
    }
    return res;
}

上述代码与单调递增栈类似,只是从右往左遍历数组,同时使用单调递减栈。

3. 总结

单调栈是一个非常实用的算法,能够有效地解决一些问题。在本文中,我们介绍了单调递增栈和单调递减栈的应用,并给出了示例说明。希望本文能够帮助到大家。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java算法真题详解运用单调栈 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • Tomcat服务器的安装配置图文教程(推荐)

    下面详细讲解“Tomcat服务器的安装配置图文教程(推荐)”的完整攻略。 1. 下载与安装Tomcat 首先,从Tomcat官网 https://tomcat.apache.org/ 下载最新的Tomcat安装文件,选择与你系统对应的版本(一般会选择zip或tar.gz压缩文件)。下载完成后,将Tomcat文件解压到你想要安装的目录中。 示例: # 假设我们…

    Java 2023年5月19日
    00
  • IDEA 如何导入别人的javaweb项目进行部署

    下面是在 IDEA 中导入别人的 JavaWeb 项目并进行部署的详细攻略: 步骤1:下载并安装 IDEA 如果您还没有安装 IDEA,可以到 IntelliJ IDEA 官网下载对应版本并安装。安装过程中请按照提示一步一步操作即可。 步骤2:下载并解压缩 JavaWeb 项目 假设您已经获得了别人的 JavaWeb 项目源代码,接下来需要将其解压缩到本地。…

    Java 2023年6月2日
    00
  • SpringBoot整合Shiro和Redis的示例代码

    下面我将为你详细讲解“SpringBoot整合Shiro和Redis的示例代码”的具体过程,包含示例代码说明。 一、引入相关依赖 首先需要在 pom.xml 文件中引入相关依赖,包括 SpringBoot、Shiro 和 Redis 的依赖,示例代码如下: <dependencies> <!– SpringBoot 依赖 –> &…

    Java 2023年6月15日
    00
  • java之StringBuffer常见使用方法解析

    Java之StringBuffer常见使用方法解析 什么是StringBuffer StringBuffer类是Java语言中被广泛使用的字符串处理类之一,它是一个可变字符串类,可以动态的插入、删除、替换、反转字符串中的字符。 StringBuffer的常用方法 构造函数 StringBuffer提供了多个构造函数,用于构建不同的StringBuffer实例…

    Java 2023年5月27日
    00
  • SpringBoot项目打成war和jar的区别说明

    Spring Boot 是一个轻量化的框架,可以用于快速构建基于 Spring 的 Web 应用程序。它们可以以两种不同的形式进行部署:WAR 和 JAR。这里将详细讲解 WAR 和 JAR 的区别,以及其在 Spring Boot 项目中运用的使用方法。 WAR 和 JAR 的区别 WAR 和 JAR 是两个在 Java 环境中经常使用的文件类型。它们有以…

    Java 2023年5月19日
    00
  • Java实战之图书管理系统的实现

    Java实战之图书管理系统的实现攻略 介绍 图书管理系统是一个广受欢迎的Java项目,本文主要介绍如何使用Java语言实现一个图书管理系统,并分为以下几个步骤: 设计数据库 创建项目 实现前端界面 实现后台逻辑 测试和部署 设计数据库 图书管理系统需要设计一个数据库,用来存储图书信息和用户信息。我们可以使用MySQL数据库,并创建两个表,一个是图书信息表,另…

    Java 2023年5月19日
    00
  • SpringBoot实现统一封装返回前端结果集的示例代码

    下面我来详细讲解如何实现SpringBoot的统一封装返回前端结果集的示例代码的完整攻略。 1. 为什么需要统一封装返回结果集 在我们使用SpringBoot开发Web应用时,通常经常会用到Controller来处理请求。Controller的主要作用是接收请求,处理业务逻辑,然后将结果返回给前端。通常情况下,我们在Controller方法中使用如下方式处理…

    Java 2023年5月26日
    00
  • 解决Spring Boot 在localhost域奇怪的404问题(Mac book pro)

    解决Spring Boot在localhost域奇怪的404问题可能涉及以下几个方面: 确认应用程序是否正确配置 确认本地主机文件是否正确配置 检查应用程序的端口是否被防火墙阻止 下面我将详细讲解如何逐步完成以上三个步骤。 1. 确认应用程序是否正确配置 在Spring Boot应用程序中,主类带有@SpringBootApplication注解。确保该注解…

    Java 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部