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

yizhihongxing

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日

相关文章

  • 学好Java MyBatis拦截器,提高工作效率

    学好Java MyBatis拦截器可以提高工作效率,以下是学习拦截器的完整攻略: 1. 拦截器功能及作用 在学习拦截器之前,我们需要了解拦截器的作用。拦截器提供了一种拦截和修改程序执行的方式,以便动态地添加、修改或删除程序的功能。它也可以用于收集日志,或者权限控制等。 MyBatis的拦截器可以作用于执行器、参数处理器、结果集处理器、SQL语句生成器的过程中…

    Java 2023年5月20日
    00
  • Java数学工具类MathUtil详解

    Java数学工具类MathUtil详解 Java的Math类提供了很多数学运算的相关方法,例如:sin、cos、sqrt、abs等。但是,在实际开发中,我们往往需要自己实现一些复杂的数学运算,那么这个时候,我们就需要一个专门的数学工具类来帮助我们解决问题。本文就介绍一个Java数学工具类MathUtil,该工具类提供了一些常见的数学运算方法,例如:阶乘、排列…

    Java 2023年5月26日
    00
  • java多线程模拟交通灯管理系统

    下面我将详细讲解如何编写一个Java多线程模拟交通灯管理系统。 前言 交通灯是城市中必不可少的重要设施之一,能帮助路面交通管理变得更加有序。为了更好地理解交通灯的工作原理,我们可以开发一个Java多线程模拟交通灯管理系统来模拟交通灯的运行过程。 设计思路 我们的系统需要设计两个交通灯对象,即红绿灯和绿红灯,交替更替地工作。为了实现此目的,我们可以使用多线程的…

    Java 2023年5月19日
    00
  • java断点续传功能实例(java获取远程文件)

    下面我来详细讲解“Java断点续传功能实例(Java获取远程文件)”的完整攻略。 什么是断点续传功能 断点续传是指将文件的下载和上传分为多个部分,当其中的一个部分出现中断时,可以恢复该部分下载或上传的功能。在传输大文件或者网络情况不好的时候,这个功能可以帮助用户更快地获取或传输文件,提高了用户体验。 实现Java断点续传的方法 Java实现断点续传的方法是通…

    Java 2023年5月31日
    00
  • JavaScript设计模式之责任链模式实例分析

    以下是“JavaScript设计模式之责任链模式实例分析”完整攻略。 标题 JavaScript设计模式之责任链模式实例分析 简介 责任链模式(Chain of Responsibility Pattern)是一种行为设计模式,它用于将请求沿着处理程序链进行传递,直到其中一个处理程序能够处理该请求。该模式允许多个对象处理请求,而不必相互引用,并且请求发送者和…

    Java 2023年5月26日
    00
  • Spring boot整合shiro+jwt实现前后端分离

    下面是“Spring Boot整合Shiro+JWT实现前后端分离”的完整攻略,包含以下步骤: 1. 添加依赖 首先要在项目的pom.xml文件中添加相关依赖。 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring…

    Java 2023年5月20日
    00
  • Intellij IDEA 2020.3 配置教程详解

    Intellij IDEA 2020.3 配置教程详解 Intellij IDEA 是一款强大的 Java 集成开发环境(IDE),提供了丰富的编辑工具、代码分析功能与调试工具,适合 Java 开发者使用。在开始使用 Intellij IDEA 之前,需要对它进行一些配置。本教程将详细讲解 Intellij IDEA 2020.3 的配置过程,包括如何配置 …

    Java 2023年5月20日
    00
  • Java Mybatis框架Dao层的实现与映射文件以及核心配置文件详解分析

    Java Mybatis是一个优秀的持久层框架,它结合了Java和SQL,解决了面向对象编程中关系数据库的持久化问题。在Java Mybatis中,Dao层是一个非常重要的组成部分,它是应用程序和数据库之间的中间层,主要用于数据访问的封装和管理,而映射文件则用于将SQL语句与Dao层的方法进行映射,核心配置文件则用于对Java Mybatis框架进行配置和管…

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