【LeetCode】升级打怪之路 Day 11:栈的应用、单调栈

今日题目:

  • Problem 1: 栈的应用
    • 155. 最小栈 | LeetCode
    • 20. 有效的括号 | LeetCode
    • 150. 逆波兰表达式求值 | LeetCode
  • Problem 2: 单调栈
    • 496. 下一个更大元素 I
    • 739. 每日温度
    • 503. 下一个更大元素 II

目录

    • Problem 1:栈 - “先进后出”的应用
      • LC 155. 最小栈 【easy】
      • LC 20. 有效的括号 【easy】
      • LC 150. 逆波兰表达式求值 【easy】
    • Problem 2:单调栈 【必会】
      • ✴️ 单调栈解决的基本问题:找下一个更大元素 【classic】
      • LC 496. 下一个更大元素 I
      • LC 739. 每日温度
      • LC 503. 下一个更大元素 II 【稍有难度】
      • 单调栈问题总结

今天主要学习了栈的一些应用和单调栈。

  • 栈的基本应用已经学习过很多次了,像括号匹配等问题,比较熟悉了,所以难度不大。
  • 单调栈比较重要,它解决了“寻找每个元素的下一个更大元素”这个基本问题。我们要学会解决这个基本问题的代码思路,并将其通过转化来解决具体问题。

所以,单调栈是今天的重点,要学会其解决“寻找下一个更大元素”这个基本问题的思路,再学习如何将其用于解决具体问题

Problem 1:栈 - “先进后出”的应用

LC 155. 最小栈 【easy】

155. 最小栈 | LeetCode

这个题目做过多次了,难度不大。

LC 20. 有效的括号 【easy】

20. 有效的括号 | LeetCode

括号匹配是使用栈解决的经典问题。通过这个题,可以学会如何灵活运用 stack 来解决这个问题。

LC 150. 逆波兰表达式求值 【easy】

150. 逆波兰表达式求值 | LeetCode

也是一个栈的经典应用,难度不大(也可能是写过好几次了)。

Problem 2:单调栈 【必会】

单调栈用于解决找下一个更大元素的问题。这是 LeetCode 中一类经典问题。学会的话就不难,没学的话一时也不太好想到思路。

首先需要学会使用单调栈的基本模板,然后再学习如何利用它解决具体的问题。

✴️ 单调栈解决的基本问题:找下一个更大元素 【classic】

参考 单调栈结构解决三道算法题 | labuladong

首先明确单调栈所能解决的基本问题给一个数组 A,找出其中每个元素的右边的下一个更大元素。比如 A = [5, 1, 7],那么结果就是 answer = [7, 7, -1],因为 5 和 1 的下一个更大元素都是 7,而 7 没有下一个更大元素,于是填充 -1 作为特殊值。当然,answer 中的值也可以是 A 的下标索引,这样就是 answer = [2, 2, -1],因为 A[0] 和 A[1] 的下一个更大元素的索引都是 2,所以 answer[0] 和 answer[1] 都是 2。

解决的思想是,假设每个元素的值就是这个元素的身高,让每个元素向后看,比自己矮的都身高不够,而第一个露出头来比自己高的那个元素就是答案,比如下图:

比身高

图片来自 labuladong

那寻找 answer 的方法,从代码上实现思路就是声明一个 stack,从后向前遍历 nums,每次元素入栈前,把栈顶上挤压掉身高小于等于自己的元素,然后记录下栈顶(也就是 nums[i] 身后更大的元素),接着入栈,继续下一轮循环,直到遍历 nums 结束。代码如下:

int[] findNextLarger(int[] nums) {int[] nextLarger = new int[nums.length];  // 存放 answerList<Integer> stack = new ArrayList<>();  // 单调栈// 从后向前遍历 numsfor (int i = nums.length - 1; i >= 0; i--) {// 挤压掉身高小于等于自己的元素while (!stack.isEmpty() && stack.getLast() <= nums[i]) {stack.removeLast();}// 记录栈顶元素作为 nums[i] 身后的更大元素nextLarger[i] = stack.isEmpty()? -1: stack.getLast();// 入栈nextLarger.addLast(nums[i]);} return nextLarger;
}

这个问题中,每个元素都被 push 一次,最多被 pop 一次,所以复杂度是 O ( n ) O(n) O(n)

有了解决这个基本问题的代码模板,我们就可以用这个单调栈的思路来解决一些具体的问题了。

LC 496. 下一个更大元素 I

496. 下一个更大元素 I | LeetCode

学会了上面的基本代码模板,解决这个问题就会容易很多了。

这个题目的特殊之处在于,我们需要找 nums2 的子集 nums1 在 nums2 中的下一个更大元素,所以我们对 nums2 使用之前的方法来得到 nextLarger 数组,然后需要再将其转换为 map,记录着 元素 -> 下一个更大元素 的映射,然后 nums1 就可以使用这个 map 进行检索从而得到答案。

代码如下图:

496
可以看出来,解决这个问题的关键还是使用单调栈。

LC 739. 每日温度

739. 每日温度 | LeetCode

这也是对基本问题的一个变形,我们再 nextLarger 中需要存的不是下一个更大的元素,而是下一个更大元素的索引下标,这样才能计算出索引下标的差值。学会基本问题之后,难度也不大。

LC 503. 下一个更大元素 II 【稍有难度】

503. 下一个更大元素 II | LeetCode

这也是一个基本问题的变形,基本问题中,nums 是一个普通数组,而这个题将 nums 定义为一种环形数组。

面对这种需求,常用套路就是将数组长度翻倍:

翻倍数组

实现这种“翻倍”的效果的方式,可以构造新数组、可以利用循环数组的技巧(取模)、可以两次循环等等,都可以。

单调栈问题总结

我们学会了单调栈解决“下一个更大元素”这个基本问题的解题方法,但在实际应用中,题目往往会更加复杂一些,这时我们需要把具体问题转化为单调栈相关问题来解决

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

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

相关文章

IO(Linux)

文件系统 前言1. 回顾关于C文件部分函数2. 一些文件知识的共识3. 相对路径4. fwrite中的\0 一、文件描述符fd1. 概念2. 系统调用① open 和 close② write③ read 和 lseek 3. 缺省打开的fd 二、重定向1. 原理2. 系统调用dup23. stdout和stderr的区别4. 进程替换和原来进程文件…

Linux笔记-3

软件安装 概述 在Linux中&#xff0c;软件安装分为3种方式&#xff1a;绿色安装(压缩包解压之后就能直接使用)&#xff0c;rpm安装(类似于Windows中的exe或者msi文件)&#xff0c;yum安装 RPM(Red Hat Package Manager)&#xff1a;红帽提供的软件包的管理工具。可以通过rpm命…

Github项目推荐-LightMirrors

项目地址 https://github.com/NoCLin/LightMirrors 项目简述 “LightMirrors是一个开源的缓存镜像站服务&#xff0c;用于加速软件包下载和镜像拉取。目前支持DockerHub、PyPI、PyTorch、NPM等镜像缓存服务。 当前项目仍处于早期阶段。”–来自项目说明。 也就是说&#xff…

vue中使用prettier

前言&#xff1a;prettier是一款有态度的代码格式化工具&#xff0c;它可以集成在IDE中&#xff0c;如VS Code、Web Storm等&#xff0c;也可以安装到我们开发的项目里面。本文主要讲解在Vue中集成prettier的过程&#xff0c;可以便于代码检测和格式化。 prettier官网 从官网的…

ardupilot 及PX4姿态误差计算算法对比分析

目录 文章目录 目录摘要1.APM姿态误差计算算法2.PX4姿态误差计算算法3.结论摘要 本节主要记录ardupilot 及PX4姿态误差计算算法差异对比过程,欢迎批评指正。 备注: 1.创作不易,有问题急时反馈 2.需要理解四元物理含义、叉乘及点乘含义、方向余弦矩阵含义、四元数乘法物理含…

vue+element ui上传图片到七牛云服务器

本来打算做一个全部都是前端完成的资源上传到七牛云的demo&#xff0c;但是需要获取token&#xff0c;经历了九九八十一难&#xff0c;最终还是选择放弃&#xff0c;token从后端获取&#xff08;springboot&#xff09;。如果你们有前端直接能解决的麻烦记得私我哦&#xff01;…

【最新】如何将idea上的项目推送到gitee

1.打开Gitee&#xff0c;在首页&#xff0c;点击“”&#xff0c;创建一个仓库 2.填写仓库基本信息 3.下拉&#xff0c;点击“创建”&#xff0c;出现下方页面&#xff0c;证明仓库创建成功。 4.打开idea&#xff0c;下载gitee的插件&#xff08;此处默认已经下载git&#xff0…

布隆过滤器实战

一、背景 本篇文章以解决实际需求的问题的角度进行切入&#xff0c;探讨了如果使用布隆过滤器快速丢弃无效请求&#xff0c;降低了系统的负载以及不必要的流量。 我们都知道布隆过滤器是以占用内存小&#xff0c;同时也能够实现快速的过滤从而满足我们的需求&#xff0c;本篇…

termux上安装Python

Termux是一款Android平台下的终端模拟器和Linux环境应用&#xff0c;它允许用户在移动设备上访问Linux命令行界面&#xff0c;以便使用命令行工具、脚本、开发环境等功能。 要在Termux上安装Python&#xff0c;请按照以下步骤进行操作&#xff1a; 一&#xff0c;下载termux …

温湿度传感器SHT21

SHT21是一款基于IIC的温湿度传感器&#xff0c;它的引脚及定义如下&#xff1a; 标准的IIC器件&#xff0c;没有其他多余的引脚&#xff0c;应用框图如下&#xff1a; 温度的测量范围是-40到125℃&#xff0c;湿度测量范围0-100%RH&#xff0c;具体参数及采样精度见下图&#x…

如何限制一个账号只在一处登陆

大家好&#xff0c;我是广漂程序员DevinRock&#xff01; 1. 需求分析 前阵子&#xff0c;和问答群里一个前端朋友&#xff0c;随便唠了唠。期间他问了我一个问题&#xff0c;让我印象深刻。 他问的是&#xff0c;限制同一账号只能在一处设备上登录&#xff0c;是如何实现的…

C语言操作符详解(一)

一、操作符的分类 • 算术操作符&#xff1a; 、- 、* 、/ 、% • 移位操作符:<< >> • 位操作符: & | ^ • 赋值操作符: 、 、 - 、 * 、 / 、% 、<< 、>> 、& 、| 、^ • 单⽬操作符&#xff1a; &#xff01;、、--、&、*、、…

嵌入式基础知识-信号量,PV原语与前趋图

本篇来介绍信号量与PV原语的一些知识&#xff0c;并介绍其在前趋图上的应用分析。本篇的知识属于操作系统部分的通用知识&#xff0c;在嵌入式软件开发中&#xff0c;同样会用到这些知识。 1 信号量 信号量是最早出现的用来解决进程同步与互斥问题的机制&#xff08;可以把信…

深入了解 Android 中的 FrameLayout 布局

FrameLayout 是 Android 中常用的布局之一&#xff0c;它允许子视图堆叠在一起&#xff0c;可以在不同位置放置子视图。在这篇博客中&#xff0c;我们将详细介绍 FrameLayout 的属性及其作用。 <FrameLayout xmlns:android"http://schemas.android.com/apk/res/androi…

计算机组成原理(超详解!!) 第一节 导论

1.计算机的性能指标 1.字长 一般大型计算机字长为32位或64位&#xff1b; 小型计算机字长为16位或32位&#xff1b;微型计算机字长有1位、4位、8位、16位&#xff1b; 高档微型计算机字长为32位和64位。对于字长短的计算机&#xff0c;为了提高计算精度&#xff0c;采用多字…

基于SSM的农业电商服务系统(农产品销售管理系统)(有报告)。Javaee项目。ssm项目。

演示视频&#xff1a; 基于SSM的农业电商服务系统&#xff08;农产品销售管理系统&#xff09;&#xff08;有报告&#xff09;。Javaee项目。ssm项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#…

可视化大屏实现屏幕自适应和自动全屏的实现

前言 在可视化大屏项目中&#xff0c;屏幕适配是绕不过去的一个问题&#xff08;ps&#xff1a;如果知道大屏展示的屏幕是固定的&#xff0c;当我没说&#xff09;。这里简单介绍通过 css的transform属性 里面的 scal() 实现常规屏幕适配。 常规屏幕&#xff1a; 1366 * 768…

【蓝桥备赛】双指针

日志统计 双指针在算法中也是经常会用到的&#xff0c;比如原地交换数组中的元素就可以用双指针来做&#xff0c;但是有的时候可能看不出来是双指针的思想。 对于一对数字可以用pair类型&#xff0c;cnt表示类型的次数&#xff0c;bool数组表示当前是否符合大于等于k的条件。 …

Vue.js+SpringBoot开发高校实验室管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、研究内容2.1 实验室类型模块2.2 实验室模块2.3 实验管理模块2.4 实验设备模块2.5 实验订单模块 三、系统设计3.1 用例设计3.2 数据库设计 四、系统展示五、样例代码5.1 查询实验室设备5.2 实验放号5.3 实验预定 六、免责说明 一、摘…

Unity游戏输入系统(新版+旧版)

使用新版还是旧版 旧版 using System.Collections; using System.Collections.Generic; using UnityEngine;public class c5 : MonoBehaviour {void Start(){}void Update(){// 注意要在游戏中 点鼠标键盘进行测试// 鼠标// 0左键 1右键 2滚轮if (Input.GetMouseButtonDown(0)…