首页 > 编程语言 >单调栈求解算法

单调栈求解算法

时间:2023-12-20 11:45:45浏览次数:38  
标签:遍历 nums int 元素 算法 求解 数组 stack 单调

例题:503. 下一个更大元素 II

给定一个循环数组 nums ( nums[nums.length - 1] 的下一个元素是 nums[0] ),返回 nums 中每个元素的 下一个更大元素 。

数字 x 的 下一个更大的元素 是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它的下一个更大的数。如果不存在,则输出 -1 。

示例 1:

输入: nums = [1,2,1]
输出: [2,-1,2]
解释: 第一个 1 的下一个更大的数是 2;
数字 2 找不到下一个更大的数; 
第二个 1 的下一个最大的数需要循环搜索,结果也是 2。

示例 2:

输入: nums = [1,2,3,4,3]
输出: [2,3,4,-1,4]

求解:
public class NUM_503 {
    public int[] nextGreaterElements(int[] nums) {
        // 1、创建一个栈
        Stack<Integer> stack = new Stack<>();
        int len = nums.length;
        // 2、创建一个保存结果的数组
        int[] ret = new int[len];
        for (int i = 2 * len - 1; i >= 0; i--) {
            while (!stack.isEmpty() && stack.peek() <= nums[i % len]) {
                stack.pop(); // 当前元素比栈顶元素小,就出栈,
            }
            ret[i % len] = stack.isEmpty() ? -1 : stack.peek();
            stack.push(nums[i % len]);
        }
        return ret;
    }
}

 解析:

此题和一般的单调栈相比,数组是一个循环数组,和一般的相比只需要让循环的长度变成2倍的数组长度即可
1、下一个最大元元素,找当前元素右边的元素,所以倒着遍历数组
2、找当前元素左边最小的元素,就正着遍历数组
3、一个栈+一个while循环

为啥倒着遍历:
例如,2,4,3,5,6,7,1
输出:5 5 5 7 -1 -1
倒着遍历:1的下一个元素,没有,故-1;
7的下一个元素为1,故-1,把7入栈
对于6而言,6比7小,故6对应的7
5比6小,所以是6;
3比5小,对应3的结果就是5;
当遍历到4时,栈的元素是3,4比3大,所以要把3出栈,原因很简单:因为4比3大,3没有必要存在栈中,因为下一个元素如果以4为最大元素,那肯定不会遍历到3,如果不以4为最大元素,那肯定也不会以3为最大元素
关键点就是:
while (!stack.isEmpty() && stack.peek() <= nums[i % len])

  

如果找数组中,左边第一个比他小的数,只需要正向遍历,修改while中的条件即可



 

标签:遍历,nums,int,元素,算法,求解,数组,stack,单调
From: https://www.cnblogs.com/gchenghu/p/17916190.html

相关文章

  • 【洛谷】P1024 [NOIP2001 提高组] 一元三次方程求解 (二分)
    题目描述见此:P1024如何求一个方程的根呢qwq首先,根是什么,函数y=f(x)有零点⇔方程f(x)=0有实数根⇔函数y=f(x)的图象与x轴有交点。回顾我们高一学过的一个定理:零点存在性定理:如果函数y=f(x)在区间[a,b]上的图象是连续不断的一条曲线,并且有f(a)·f(b)<0,那么,函数y=f(x)在区间(a,b)......
  • 羚通视频智能分析平台森林防火预警 烟火检测算法识别
    羚通视频智能分析平台是一项利用先进的人工智能技术进行实时监控的创新解决方案。该平台专门设计出用于森林防火的烟火识别预警系统,旨在提高森林防火的效率和准确性。该系统的核心是烟火识别算法,它基于深度学习技术。通过对大量烟火图像数据的学习和训练,该算法形成了......
  • 羚通视频智能分析平台危险区域行人入侵算法识别检测
    羚通视频智能分析平台的危险区域行人入侵检测算法是一种基于计算机视觉和深度学习等前沿技术的应用,它通过实时处理和分析视频图像,对行人目标进行准确识别和跟踪。该算法利用先进的计算机视觉技术,能够自动识别行人特征,如头部、身体轮廓等,并根据这些特征进行分类和预测,从而为行人入......
  • 算法数组集合
    JDK1.0java.util.Date缺陷:偏移量JDK1.1java.util.Calendar线程不安全缺陷:a.偏移量b.可变性,线程不安全的c.格式化:java.text.DateFormat只适用于Date,不能用于CalendarJDK8.0java.time:时间包LocalDate:只有年月日LocalTime:只有时分秒L......
  • 决策树算法思想及其Python实现
    决策树算法是一种在机器学习和数据挖掘领域广泛应用的强大工具,它模拟人类决策过程,通过对数据集进行逐步的分析和判定,最终生成一颗树状结构,每个节点代表一个决策或一个特征。决策树的核心思想是通过一系列问题将数据集划分成不同的类别或值,从而实现对未知数据的预测和分类。这一算......
  • 算法学习笔记(8.3): 网络最大流 - 模型篇
    本文慢慢整理部分模型。DAG最小路径覆盖经典的题目,经典的思想。网络流常见的将图上的点拆为入点和出点,那么路径由若干出-入-出-入的循环构成。于是在拆好的图上流一流即可。[CTSC2008]祭祀典中祭黑白染色利用黑白染色将整个图变成一个二分图是网络流常见的套路,......
  • 代码随想录算法训练营第七天|454.四数相加II,383. 赎金信,15. 三数之和,18. 四数之和
    一、454.四数相加II题目链接:LeetCode454.四数相加II学习前:思路:首先定义两个HashMap对象record12和record34,对应的key存放两个数组元素的和,value存放计算的和出现的次数接着遍历record12,若record存在与之和为0的元素,则计算两个value相乘的结果,并进行累积,作为输出的结果......
  • 目标检测算法中的AP以及mAP值的计算
    mAP的是各个类别的AP的值的平均值#https://blog.csdn.net/qq_36523492/article/details/108469465计算方法选择第二种方法theinterpolationperformedinallpoints#定义一个列表lst=[3,1,4,2]#使用sorted函数对列表进行排序,并获取原始元素在排序后列表中的索......
  • 羚通视频智能分析平台安防视频检测未带安全帽识别 算法算力检测云平台
    随着科技的不断发展,人工智能技术在各个领域的应用越来越广泛。在安防领域,视频监控系统已经成为了保障人们生命财产安全的重要手段。然而,传统的视频监控系统往往存在诸多问题,如人工监控成本高、实时性差、误报率高等。为了解决这些问题,羚通视频智能分析平台应运而生,通过先进的人工智......
  • 408---必须能手搓的算法
    一、快速排序无需多言//2023-12-19#include<iostream>#include<cstring>usingnamespacestd;voiddebug(intA[],intn){for(inti=0;i<n;i++)printf("%d",A[i]);puts("");}voidQsort(intA[],intleft,intright){......