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)  # 初始化结果列表,所有位置先设为-1for i in range(len(nums)):while stack and nums[i] > nums[stack[-1]]:# 当前元素比栈顶元素大,所以栈顶元素的左边第一个比它大的元素就是当前元素result[stack.pop()] = istack.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.mzph.cn/news/616647.shtml

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

相关文章

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为什么有阻塞式…

【教3妹学编程-算法题】统计出现过一次的公共字符串

3妹&#xff1a;哈哈哈哈哈哈&#xff0c;太搞笑了~ 呵呵呵呵呵呵 2哥&#xff1a;3妹干嘛呢&#xff0c; 笑的这么魔性&#xff01; 3妹&#xff1a;在看王牌对王牌&#xff0c;老搞笑了 2哥&#xff1a;这季好像没有贾玲吧。 3妹&#xff1a;是啊&#xff0c;听说贾玲去导电影…

Vue入门六(前端路由的概念与原理|Vue-router简单使用|登录跳转案例|scoped样式)

文章目录 前要&#xff1a;前端路由的概念与原理1&#xff09;什么是路由2&#xff09;SPA与前端路由3&#xff09;什么是前端路由4&#xff09;前端路由的工作方式 一、Vue-router简单使用1&#xff09;什么是vue-router2) vue-router 安装和配置的步骤① 安装 vue-router 包②…

React Native 桥接组件封装原生组件属性

自定义属性可以让组件具备更多的灵活性&#xff0c;所以有必要在JS 层通过自定义属性动态传值。 一、添加原生组件属性 因为 ViewManager 管理了整个组件的行为&#xff0c;所以要新增组件属性也需要在这里面&#xff08;如 InfoViewManager&#xff09;进行定义。 1、在Inf…

从DETR到Mask2Former(1):DETR-segmentation结构全解析

网上关于DETR做的detection的解析很多&#xff0c;但是DETR做Segmentation的几乎没有&#xff0c;本文结合DETR的论文与代码&#xff0c;对DETR做一个详细的拆解。理解DETR是理解Mask2Former的基础。 首先得把DETR-segmentation给run起来。Github上DETR的repository&#xff0…

【python入门】day26:统计字符串中出现指定字符的次数

案例 实际上if name“main”:就相当于是 Python 模拟的程序入口 。由于模块之间相互引用&#xff0c;不同模块可能都有这样的定义&#xff0c;而入口程序只能有一个&#xff0c;选中哪个入口程序取决于 ** ** name** **的值。 代码 #-*- coding:utf-8 -*- #开发时间&#xff…

SQL-分页查询and语句执行顺序

&#x1f389;欢迎您来到我的MySQL基础复习专栏 ☆* o(≧▽≦)o *☆哈喽~我是小小恶斯法克&#x1f379; ✨博客主页&#xff1a;小小恶斯法克的博客 &#x1f388;该系列文章专栏&#xff1a;重拾MySQL &#x1f379;文章作者技术和水平很有限&#xff0c;如果文中出现错误&am…

Pytest插件pytest-cov:优雅管理测试覆盖率

在软件开发中&#xff0c;测试覆盖率是评估测试质量的关键指标之一。为了更方便地统计和管理测试覆盖率&#xff0c;Pytest插件"pytest-cov"应运而生。本文将介绍"pytest-cov"的基本用法和优雅管理测试覆盖率的方法。 什么是pytest-cov? pytest-cov 是Pyt…

Docker数据卷与拦截与目录拦截

目录 高级容器挂载技术深度解析引言数据卷挂载原理解析应用场景使用介绍 目录挂载原理解析应用场景使用介绍 总结 高级容器挂载技术深度解析 引言 容器技术的快速发展使得容器挂载技术变得愈发重要。在容器化应用中&#xff0c;数据卷挂载和目录挂载是两种常见的挂载方式&…

【Python机器学习】SVM——调参

下面是支持向量机一个二维二分类数据集的训练结果&#xff1a; import mglearn import matplotlib.pyplot as plt from sklearn.svm import SVCplt.rcParams[font.sans-serif] [SimHei] plt.rcParams[axes.unicode_minus] False X,ymglearn.tools.make_handcrafted_dataset()…

ModuleNotFoundError: No module named ‘simple_knn‘

【报错】使用 AutoDL 复现 GaussianEditor 时引用 3D Gaussian Splatting 调用simple_knn 时遇到 ModuleNotFoundError: No module named ‘simple_knn‘ 报错&#xff1a; 【原因】 一开始以为是版本问题&#xff0c;于是将所有可能的版本都尝试了 (from versions: 0.1, 0.2…

笔试面试题——继承和组合

&#x1f4d8;北尘_&#xff1a;个人主页 &#x1f30e;个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上&#xff0c;不忘来时的初心 文章目录 一、什么是菱形继承&#xff1f;菱形继承的问题是什么&#xff1f;二、什么是菱形虚拟继承&am…

SqlAlchemy使用教程(一) 原理与环境搭建

一、SqlAlchemy 原理及环境搭建 SqlAlchemy是1个支持连接各种不同数据库的Python库&#xff0c;提供DBAPI与ORM&#xff08;object relation mapper&#xff09;两种方式使用数据库。 DBAPI方式&#xff0c;即使用SQL方式访问数据库 ORM, 对象关系模型&#xff0c;是用 Python…

1.1 计算机网络在信息时代的作用

1.1 计算机网络在信息时代的作用 网络&#xff08;Network&#xff09;由若干结点&#xff08;Node&#xff09;和连接这些结点的链路&#xff08;Link&#xff09;所组成。网络中的结点可以是计算机、集线器、交换机或者路由器等。 图1-1 多个网络还可以通过路由器互连起来&a…

记录一下误删除libc.so.6的经历

起因&#xff1a; 在配置环境时&#xff0c;出现’GLIBCXX_3.4.29 not found’的错误&#xff0c;在解决这个问题的过程中&#xff0c;需要删除sudo rm /usr/lib/x86_64-linux-gnu/libstdc.so.6软连接&#xff0c;但是一不小心sudo rm /lib/x86_64-linux-gpu/libc.so.6&#xf…

使用主题模型和古老的人类推理进行无监督文本分类

一、说明 我在日常工作中不断遇到的一项挑战是在无法访问黄金标准标签的情况下标记文本数据。这绝不是一项微不足道的任务&#xff0c;在本文中&#xff0c;我将向您展示一种相对准确地完成此任务的方法&#xff0c;同时保持管道的可解释性和易于调整。 一些读者可能已经开始考…

docker-compose一键搭建zookeeper集群

1、setup.sh setup.sh脚本用来创建本地文件夹&#xff0c;这些文件夹会被挂载到docker容器。 #!/bin/bashmkdir -p "$PWD\zoo1\data" mkdir -p "$PWD\zoo1\datalog"mkdir -p "$PWD\zoo2\data" mkdir -p "$PWD\zoo2\datalog"mkdir -p…

计算机缺失msvcp120.dll的最新解决方法,实测可以完美修复

在计算机使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是“msvcp120.dll丢失”。msvcp120.dll是Microsoft Visual C Redistributable Package的一部分&#xff0c;它是运行许多基于Windows操作系统的应用程序所必需的动态链接库文件之一。如果计算机…

Jetson_yolov8_解决模型导出.engine遇到的问题、使用gpu版本的torch和torchvision、INT8 FP16量化加快推理

1、前情提要 英伟达Jetson搭建Yolov8环境过程中遇到的各种报错解决&#xff08;涉及numpy、scipy、torchvision等&#xff09;以及直观体验使用Yolov8目标检测的过程&#xff08;CLI命令行操作、无需代码&#xff09;-CSDN博客和YOLOv8_测试yolov8n.pt&#xff0c;yolov8m.pt训…

[C#]winform部署yolov5-onnx模型

【官方框架地址】 https://github.com/ultralytics/yolov5 【算法介绍】 Yolov5&#xff0c;全称为You Only Look Once version 5&#xff0c;是计算机视觉领域目标检测算法的一个里程碑式模型。该模型由ultralytics团队开发&#xff0c;并因其简洁高效的特点而备受关注。Yol…