Java LeetCode刷题 单调栈

news2024/11/6 9:58:49

单调栈

  • 单调栈
    • 概念
  • 每日温度

单调栈

概念

单调栈(Monotonic Stack)是一个特殊的数据结构,它是一种栈,但具有单调性的特性。单调栈有两种类型:单调递增栈和单调递减栈。

在单调递增栈中,栈内的元素保持递增顺序,即后入栈的元素总是大于或等于先入栈的元素。同样,在单调递减栈中,栈内的元素保持递减顺序,即后入栈的元素总是小于或等于先入栈的元素。

以下是一个单调栈的基本实现(以单调递减栈为例):

def monotone_stack(nums):  
    stack = []  
    result = [-1] * len(nums)  
    for i in range(len(nums)):  
        while stack and nums[i] < nums[stack[-1]]:  
            # 出栈,并记录右边第一个比其小的元素的下标  
            result[stack.pop()] = i  
        stack.append(i)  
    # 处理剩余栈内元素  
    while stack:  
        result[stack.pop()] = len(nums)  
    return result

这个函数会返回一个列表,表示每个元素的右边第一个比其小的元素的下标。如果没有这样的元素,则返回数组长度(表示该元素右边没有其他元素)。注意,这个实现是针对单调递减栈的,如果需要单调递增栈,只需将比较符号从 < 改为 > 即可。

举个例子,对于输入数组 [5, 3, 1, 4, 2],单调递减栈的输出为 [4, 2, 1, 5, -1]。这表示:

  • 数字 5 右边第一个比它小的数字是 4(下标为 3)
  • 数字 3 右边第一个比它小的数字是 2(下标为 4)
  • 数字 1 右边没有比它小的数字(下标为 -1)
  • 数字 4 右边第一个比它小的数字是 2(下标为 4),但实际上这个输出是不准确的,因为数字 2 在数字 4 的左边。这里我们可以看到,这个实现其实是在找右边第一个比其小的元素,而不是左边。
  • 数字 2 右边没有比它小的数字(下标为 -1)

注意,上述例子的输出描述有误。实际上,对于输入数组 [5, 3, 1, 4, 2],正确的输出应该是每个元素的右边第一个比其大的元素的下标。为了得到左边第一个比其大的元素的下标,我们需要稍微修改一下算法。

这是一个更准确的描述和示例,展示如何使用单调栈找到每个元素左边第一个比其大的元素的位置:

def monotone_stack(nums):
    stack = []
    result = [-1] * len(nums)  # 初始化结果列表,所有位置先设为-1
    for i in range(len(nums)):
        while stack and nums[i] > nums[stack[-1]]:
            # 当前元素比栈顶元素大,所以栈顶元素的左边第一个比它大的元素就是当前元素
            result[stack.pop()] = i
        stack.append(i)  # 将当前元素下标入栈
    return result

# 示例
nums = [5, 3, 1, 4, 2]
print(monotone_stack(nums))  # 输出: [-1, 0, -1, 0, 3]

在这个修正后的示例中:

  • 数字 5 左边没有比它大的数字(下标为 -1)
  • 数字 3 左边第一个比它大的数字是 5(下标为 0)
  • 数字 1 左边没有比它大的数字(下标为 -1)
  • 数字 4 左边第一个比它大的数字是 5(下标为 0),注意这里不是 3,因为我们要找的是比 4 大的数字
  • 数字 2 左边第一个比它大的数字是 4(下标为 3)

这样,我们就得到了每个元素左边第一个比其大的元素的位置。

每日温度

https://leetcode.cn/problems/daily-temperatures/description/?envType=study-plan-v2&envId=top-100-liked
在这里插入图片描述

public static int[] dailyTemperatures(int[] temperatures){ // 栈一直单调递减
        int n = temperatures.length;
        int[] res = new int[n];

        LinkedList<Integer> stack = new LinkedList<>();
        for (int i = temperatures.length - 1; i >= 0; i--) {
            int t = temperatures[i];
            while (!stack.isEmpty() && t>=temperatures[stack.peek()]){// 有比之前大的数字就弹出去
                stack.pop();
            }

            if(!stack.isEmpty()){
                res[i] = stack.peek()-i;
            }

            stack.push(i);
        }

        return res;

    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1378375.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

客户管理系统平台是什么?客户关系管理系统的核心主要解决哪些问题?

客户管理系统平台是什么&#xff1f;客户关系管理系统的核心主要解决哪些问题&#xff1f; 阅读本文你将了解&#xff1a;一、客户管理系统平台的概念&#xff1b;二、客户关系管理系统的核心。 一、客户管理系统平台的概念 客户管理系统是专门为做好客户信息收集、管理、分…

chromedriver 114以后版本下载地址

谷歌浏览器版本经常会升级&#xff0c;chromedriver 也得下载匹配的版本 chromedriver 114以前版本下载地址https://registry.npmmirror.com/binary.html?pathchromedriver/ 找到匹配浏览器版本 查看自己浏览器版本号v120.0 v120.0版本chromedriver下载地址https://google…

图灵机:计算机科学的奠基之作

图灵机的概念由英国数学家阿兰图灵在1936年提出&#xff0c;这个时期正是计算机科学的黎明时分。那个时候&#xff0c;人们还在使用机械计算器进行计算&#xff0c;而且这些计算器的功能都非常有限。 图灵提出这个概念的初衷&#xff0c;是为了解决所谓的“判定问题”&#xf…

gazebo模型库目录(国内源)

这个是比较普遍的&#xff0c;一般用途&#xff1a; GitCode - 开发者的代码家园https://gitcode.com/geniusChinaHN/osrf.gazebo_models/tree/master/ambulance这个主要是车辆&#xff1a; car_demo: osrf汽车模型库https://gitee.com/geniuschinahn/car_demo还有这个是以前…

(26)Linux 进程通信之共享内存(共享储存空间)

共享内存是System V版本的最后一个进程间通信方式。共享内存&#xff0c;顾名思义就是允许两个不相关的进程访问同一个逻辑内存&#xff0c;共享内存是两个正在运行的进程之间共享和传递数据的一种非常有效的方式。不同进程之间共享的内存通常为同一段物理内存。进程可以将同一…

多无人机编队避障(人工势场法)

matlab2020正常运行&#xff0c;预设编队类型&#xff0c;目标位置&#xff0c;障碍物 多无人机编队避障&#xff08;人工势场法&#xff09;资源-CSDN文库

蓝桥杯单片机组备赛——蜂鸣器和继电器的基本控制

文章目录 一、蜂鸣器和继电器电路介绍二、题目与答案2.1 题目2.2 答案2.3 重点函数解析 一、蜂鸣器和继电器电路介绍 可以发现两个电路一端都接着VCC&#xff0c;所以我们只要给另一端接上低电平就可以让蜂鸣器和继电器进行工作。与操作LED类似&#xff0c;只不过换了一个74HC5…

SpringBoot 引入分页插件 PageHelper

官网 https://pagehelper.github.io/docs/howtouse/ 引入步骤 第1步&#xff1a;引入依赖 <!--分页插件--> <dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper</artifactId><version>5.3.2</ver…

适用于 Windows 的 12 个最佳免费磁盘分区管理器软件

分区是与其他部分分开的硬盘驱动器部分。它使您能够将硬盘划分为不同的逻辑部分。分区软件是一种工具&#xff0c;可帮助您执行基本选项&#xff0c;例如创建、调整大小和删除物理磁盘的分区。许多此类程序允许您更改磁盘片的标签以便于识别数据。 适用于 Windows 的 12 个最佳…

rime中州韵小狼毫 生字注音滤镜 汉字注音滤镜

在中文环境下&#xff0c;多音字是比较常见的现象。对于一些不常见的生僻字&#xff0c;或者一些用于地名&#xff0c;人名中的常见字的冷门读音&#xff0c;如果不能正确的阅读&#xff0c;例如把 荥阳 读成了 miāo yng&#xff0c;则会怡笑大方。 今天我们在rime中州韵小狼…

python 文件夹中 __init__.py

common文件夹下有&#xff1a;project&#xff0c;__init__.py&#xff0c;common1.py project文件夹内有&#xff1a;__init__.py&#xff0c;p.py common文件夹里&#xff0c;project文件夹 各放了一个 __init__.py 这样就可以在p.py内用from导入common1.py内的代码 # p…

第11章 GUI Page495~496 步骤三十一:另存为别的文件,为TrySaveFile()入参设置一些位操作

工程二 头文件中为TrySaveFile()入参设置一些位操作&#xff0c;修改一下TrySaveFile()的入参类型 修改TrySaveFile()的实现&#xff1a; 修改“保存”菜单项挂接事件响应函数: 修改“另存为”菜单项挂接事件响应函数

MFC结合GDI+

MFC结合GDI 创建一个空的MFC界面&#xff0c;在确定按钮函数里进行画图&#xff1a; 1、包含头文件与库 在stdafx.h中加入以下三行代码&#xff1a; #include "gdiplus.h" using namespace Gdiplus; #pragma comment(lib, "gdiplus.lib")2、安装GDI 在…

Linux中PyTorch的安装教程

在安装PyTorch之前&#xff0c;我们需要确保已经安装了Python和pip。可以使用以下命令检查是否已经安装&#xff1a; python --version pip --version如果没有安装&#xff0c;可以使用以下命令安装&#xff1a; sudo apt-get update sudo apt-get install python3 sudo apt-…

C++核心编程——类和对象(二)

本专栏记录C学习过程包括C基础以及数据结构和算法&#xff0c;其中第一部分计划时间一个月&#xff0c;主要跟着黑马视频教程&#xff0c;学习路线如下&#xff0c;不定时更新&#xff0c;欢迎关注。 当前章节处于&#xff1a; ---------第1阶段-C基础入门 ---------第2阶段实战…

ffmpeg命令增加headers参数解决http请求ts返回404 not found问题的解决方法:-headers、-an

最近项目上遇到一个问题&#xff0c;用ffmpeg请求录制一个m3u8的实时流成为mp4文件的时候&#xff0c;命令返回404错误&#xff1a; 但是有一个很奇怪的现象&#xff0c;就是ffmpeg请求不到的&#xff0c;VLC却能正常播放&#xff0c;对比一下抓包&#xff1a; 那么既然就差别…

leetcode17 电话号码的字母组合

方法1 if-else方法 if-else方法的思路及其简单粗暴&#xff0c;如下图所示&#xff0c;以数字234为例&#xff0c;数字2所对应的字母是abc&#xff0c;数字3所对应的是def&#xff0c;数字4所对应的是ghi&#xff0c;最后所产生的结果就类似于我们中学所学过的树状图一样&…

VUE指令(一)

vue会根据不同的指令&#xff0c;针对不同的标签实现不同的功能。指令是带有 v- 前缀的特殊标签属性。指令的职责是&#xff0c;当表达式的值改变时&#xff0c;将其产生的连带影响&#xff0c;响应式地作用于 DOM。 1、v-text&#xff1a;设置元素的文本内容&#xff0c;不会解…

LabVIEW在动态力传感器校准技术的创新应用

简介 动态力传感器校准装置集成了冲击法原理和自动化控制&#xff0c;实现精准、高效的传感器校验。LabVIEW的图形化界面提供简便操作和实时数据分析&#xff0c;显著提高了校准过程的准确度和效率。 01 系统设计和功能 动态力传感器在工业生产中发挥着重要作用&#xff0c;其…

基于SSM的驾校预约管理系统

基于SSM的驾校预约管理系统的设计与实现~ 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringSpringMVCMyBatis工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 主页 详情 管理员界面 摘要 随着社会的不断发展&#xff0c;驾驶技能的需求逐渐增…