Java LeetCode刷题 单调栈

单调栈

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

单调栈

概念

单调栈(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;

    }

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【JAVA】谈谈 ReadWriteLock 和 StampedLock

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;JAVA ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 ReadWriteLock&#xff08;读写锁&#xff09; 基本原理&#xff1a; 接口和实现&#xff1a; 用法示例&#xff1a; StampedL…

UE5 简易MC教程学习心得

https://www.bilibili.com/video/BV12G411J7hV?p13&spm_id_frompageDriver&vd_sourceab35b4ab4f3968642ce6c3f773f85138 ———— 目录 0.摧毁逻辑学习 1.发光材质灯方块 2.封装。想让子类 不更改父类的变量。 3.材质命名习惯。 0.摧毁逻辑学习 达到摧毁的条件…

日志审计系统Agent项目创建——读取日志文件(Linux版本)

紧接着上一篇的分享&#xff0c;继续做日志文件的读取&#xff0c;点击连接即可日志文件初始化https://blog.csdn.net/wjl990316fddwjl/article/details/135553238 1、将指针移动到文件末尾 //文件移动到结尾fseek(fp, 0, SEEK_END); 2、定义当前指针的位置 lastPosition ft…

通义灵码 - 免费的阿里云 VS code Jetbrains AI 编码辅助工具

系列文章目录 前言 通义灵码&#xff0c;是阿里云出品的一款基于通义大模型的智能编码辅助工具&#xff0c;提供行级/函数级实时续写、自然语言生成代码、单元测试生成、代码注释生成、代码解释、研发智能问答、异常报错排查等能力&#xff0c;并针对阿里云 SDK/OpenAPI 的使用…

专业130+总分400+杭州电子科技大学843信号与系统考研经验杭电信息通信

今年专业课130&#xff0c;数一130&#xff0c;初试总分400&#xff0c;顺利上岸杭电通信工程学院&#xff0c;回望这一年有得有失&#xff0c;总结了一些经验分享给大家&#xff0c;希望对大家复习有帮助。 我的初试备考从3月开始&#xff0c;持续到初试前&#xff0c;这中间…

x-cmd pkg | tsx - Node.js 的直接替代品

目录 简介首次用户功能特点竞品和相关作品进一步探索 简介 tsx 代表 “TypeScript execute”&#xff0c;由 TypeScript 编写&#xff0c;内部使用由 Go 语言编写的 esbuild 核心二进制实现超快的 TypeScript 编译&#xff0c;旨在增强 Node.js 以无缝运行 TypeScript / ESM /…

小学信息科技Python课程第2课:坐标与画笔

一、turtle画布与坐标系 在同一平面互相垂直且有公共原点的两条数轴构成平面直角坐标系。在坐标系中&#xff0c;水平方向的轴都称为x轴&#xff0c;垂直方向的轴都称为y轴 它们相交于O点&#xff0c;在这一个点里&#xff0c;x轴的值为0&#xff0c;y轴的值也为0&#xff0c;所…

业务向——基于淘宝联盟平台的CPS

业务向——基于淘宝联盟平台的CPS 导读小试牛刀签名商品活动订单获取及用户 导读 上篇文章我们分享了多多进宝平台&#xff0c;那么这篇文章想继续带来CPS业务的分享&#xff0c;这次玩转的平台是淘宝联盟。在对接的过程中&#xff0c;也是踩了一些坑&#xff0c;特别是对于订…

git修改历史(非最新)提交信息

二、修改最近第二次或更早之前的commit信息 当前有三次提交&#xff0c;从近到远分别为1、2、3 以修改第2次提交为例&#xff08;从最新往前数&#xff09; 1、使用命令git rebase -i HEAD~2 按i进入编辑模式&#xff0c;将对应的pick改为edit&#xff0c;然后ctrlc退出。最…

环形链表[简单]

优质博文&#xff1a;IT-BLOG-CN 一、题目 给你一个链表的头节点head&#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟踪next指针再次到达&#xff0c;则链表中存在环。为了表示给定链表中的环&#xff0c;评测系统内部使用整数pos来表示链…

【算法与数据结构】62、LeetCode不同路径

文章目录 一、题目二、解法2.1 动态规划解法2.2 数论解法 三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 2.1 动态规划解法 思路分析&#xff1a;机器人只能向下或者向右移动&#xff0c;那么到达&a…

Komodor:Kubernetes 监控工具全面指南

为了方便起见&#xff0c;Komodor 提供了一个简单的 Web 界面&#xff0c;以帮助您监控 Kubernetes 集群的状态。它拥有付费和免费增值计划&#xff0c;除了在出现问题时通知用户外&#xff0c;还拥有一系列方便的工具&#xff0c;用于跟踪和管理集群中部署的资源的状态。让我们…

单片机I/O口驱动MOS管

自记录&#xff1a; 使用单片机做一个PLC,输出可如下两种情况&#xff1a; 单片机I/O口驱动&#xff0c;为什么一般都选用三极管而不是MOS管&#xff1f; 1.单片机的IO口&#xff0c;有一定的带负载能力。但电流很小&#xff0c;驱动能力有限&#xff0c;一般在10-20mA以内。…

【Java SE语法篇】6.数组

&#x1f4da;博客主页&#xff1a;爱敲代码的小杨. ✨专栏&#xff1a;《Java SE语法》 ❤️感谢大家点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;&#xff0c;您的三连就是我持续更新的动力❤️ 文章目录 1.数组的基本概念1.1 为什么使用数组&#xff1f;1.…

Realm Management Extension领域管理扩展之安全状态

RME基于Arm TrustZone技术。TrustZone技术在Armv6中引入,提供以下两个安全状态: 安全状态(Secure state)非安全状态(Non-secure state)以下图表显示了在AArch64中的这两个安全状态以及通常在每个安全状态中找到的软件组件: 该架构将在安全状态运行的软件与在非安全状态运…

【Linux实用篇】Linux常用命令(1)

目录 1.1 Linux命令初体验 1.1.1 常用命令演示 1.1.2 Linux命令使用技巧 1.1.3 Linux命令格式 1.2 文件目录操作命令 1.2.1 ls 1.2.2 cd 1.2.3 cat 1.2.4 more 1.2.5 tail 1.2.6 mkdir 1.2.7 rmdir 1.2.8 rm 1.1 Linux命令初体验 1.1.1 常用命令演示 在这一部分中…

C#,卡特兰数(Catalan number,明安图数)的算法源代码

一、概要 卡特兰数&#xff08;英语&#xff1a;Catalan number&#xff09;&#xff0c;又称卡塔兰数、明安图数&#xff0c;是组合数学中一种常出现于各种计数问题中的数列。以比利时的数学家欧仁查理卡特兰的名字来命名。1730年左右被蒙古族数学家明安图使用于对三角函数幂…

Linux 【C编程】IO进阶— 阻塞IO、非阻塞IO、 多路复用IO、 异步IO

文章目录 1.阻塞IO与非阻塞IO1.1为什么有阻塞式&#xff1f;1.2非阻塞 2.阻塞式IO的困境3.并发IO的解决方案3.1非阻塞式IO3.2多路复用IO3.2.1什么是多路复用IO&#xff1f;3.2.1多路复用IO select原理3.2.1多路复用IO poll原理 3.3异步IO 1.阻塞IO与非阻塞IO 1.1为什么有阻塞式…

国产麒麟系统开机没有网络需要点一下这个设置

问题描述&#xff1a; 一台国产电脑网线连接正常&#xff0c;打开网页后显示无法访问&#xff0c;那么是什么原因无法上网呢&#xff1f;下面就告诉你一个小方法去解决一下这个问题&#xff1b; 检查故障&#xff1a; 检测交换机、网线、水晶头全都正常&#xff0c;同房间摆放的…

ZooKeeper 实战(二) 命令行操作篇

文章目录 ZooKeeper 实战(二) 命令行操作篇1. 服务端命令1.1. 服务启动1.2. 查看服务1.3. 重启服务1.4. 停止服务 2. 客户端命令2.1. 启动客户端2.2. 查看节点信息查看根节点详情 ls -s /添加一个watch监视器 ls -w /列举出节点的级联节点 ls -R / 2.3. 查看节点状态2.4. 创建节…