第十章 单调栈 part02 503.下一个更大元素II 42. 接雨水

news/2025/3/5 0:00:40/

第六十二天| 第十章 单调栈 part02 503.下一个更大元素II 42. 接雨水

一、503.下一个更大元素II

  • 题目链接:https://leetcode.cn/problems/next-greater-element-ii/

  • 题目介绍:

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

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

      示例 1:

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

    • 本题与“每日最高温度”的区别在于:

      • 本题改成**循环数组**了

        • 成环之后怎么操作呢?这里提供一种思路,凡是成环的题目都可以这么求解

        • 首先遍历的下标最大值为数组长度的2倍,我们要操作的下标的i对数组长度取模

        • 即:

          • for (int i = 1; i < nums.length * 2; i++) {// nums[i % nums.length]
            }
            
    • 其他代码一样

  • 代码:

class Solution {public int[] nextGreaterElements(int[] nums) {int[] reuslt = new int[nums.length];Arrays.fill(reuslt, -1);Deque<Integer> stack = new LinkedList<>();stack.push(0);for (int i = 1; i < nums.length * 2; i++) {if (nums[i % nums.length] <= nums[stack.peek()]) {stack.push(i % nums.length);} else {while (!stack.isEmpty() && nums[i % nums.length] > nums[stack.peek()]) {reuslt[stack.peek()] = nums[i % nums.length];stack.pop();}stack.push(i % nums.length);}}return reuslt;}
}

二、42. 接雨水

  • 题目链接:https://leetcode.cn/problems/trapping-rain-water/

  • 题目介绍:

    • 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。

      示例 1:

      外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

      输入:height = [0,1,0,2,1,0,1,3,2,1,2,1]
      输出:6
      解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。 
      
  • 思路:

    • 本题一个最关键的思路是:
      • 定位当前元素左边第一个最大的值和右边第一个最大的值,高度就是min(左边第一个最大的值,右边第一个最大的值),宽度就是右边的下标-左边的下标-1当前元素对应的雨水,就是高度乘以宽度得到的面积,最后再求和。
      • 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
      • 单调栈还是单调递增的
        • 右边第一个最大的值,是当前元素大于栈口元素时,当前元素就是栈口元素的右边第一个最大的的值
        • 左边第一个最大的值,是栈口元素在栈中的下一个值
  • 代码:

class Solution {public int trap(int[] height) {// 用于接收结果int sum = 0;Deque<Integer> stack = new LinkedList<>();stack.push(0);for (int i = 1; i < height.length; i++) {if (height[i] <= height[stack.peek()]) {stack.push(i);} else {while (!stack.isEmpty() && height[i] > height[stack.peek()]) {int mid = stack.pop();// 因为下面有对栈操作,所以需要判断栈不为空if (!stack.isEmpty()) {int left = stack.peek();int h = Math.min(height[left], height[i]) - height[mid];int w = i - stack.peek() - 1;sum += h * w;}}stack.push(i);}}return sum;}
}

http://www.ppmy.cn/news/1143958.html

相关文章

Windows11更新后Chrome无法打开解决方案

引言 最近更新了win11后&#xff0c;chrome突然抽风无法打开了&#xff0c;不知道是不是微软的锅&#xff0c;上网查询发现似乎有很多人最近碰到了相同的问题&#xff0c;试了试最为广泛传播的方案–更改manifest文件。然而在我这无效&#xff0c;索性直接重装&#xff0c;发现…

centos openssh升级

注意&#xff1a; openssh升级异常会造成服务失联&#xff0c;如果在允许的情况下可以安装talent服务&#xff0c;使用talent升级&#xff1b; 如果不能安装talent服务&#xff0c;可以打开多个终端&#xff0c;启动ping命令&#xff0c;防止升级终端失败后&#xff0c;作为备用…

【stm32芯片设置解惑】:stm32F103系列的开漏输出和推挽输出的区别

场景&#xff1a; 大家在开发stm32的时候&#xff0c;不管是标准库开发还是hal库开发&#xff0c;最基础的就是芯片引脚的某某设置&#xff0c;为什么这么设置&#xff1f;这样设置的好处是什么&#xff1f; 问题描述 — 开漏输出和推挽输出的用处和区别 什么是开漏输出&#x…

论文解析——异构多芯粒神经网络加速器

作者 朱郭益, 马胜&#xff0c;张春元, 王波&#xff08;国防科技大学计算机学院&#xff09; 摘要 随着神经网络技术的快速发展, 出于安全性等方面考虑, 大量边缘计算设备被应用于智能计算领域。首先&#xff0c;设计了可应用于边缘计算的异构多芯粒神经网络加速器其基本结构…

【Mybatis源码】GenericTokenParser解析器

GenericTokenParser是Mybatis中定义的进行解析文本中标志的类,本篇我们主要介绍GenericTokenParser解析文本中标志的原理。 一、GenericTokenParser构造方法 public GenericTokenParser(String openToken, String closeToken, TokenHandler handler) {this.openToken = open…

Spring核心源码-如何解决循环依赖

假设有两个类A和B B是A的成员变量&#xff0c;A也是B的成员变量。 假设类A的bean为a&#xff0c;类B的bean为b。且IOC容器先处理A。 熟悉Spring容器初始化的同学&#xff0c;应该都知道&#xff0c;容器初始化的过程中&#xff0c;bean的创建是如下触发的&#xff1a; getBean…

【线性代数及其应用 —— 第一章 线性代数中的线性方程组】-1.线性方程组

所有笔记请看&#xff1a; 博客学习目录_Howe_xixi的博客-CSDN博客https://blog.csdn.net/weixin_44362628/article/details/126020573?spm1001.2014.3001.5502思维导图如下&#xff1a; 内容笔记如下&#xff1a;

Nginx搭建Rtmp流媒体服务,并使用Ffmpeg推流

文章目录 1.rtmp流媒体服务框架图2.nginx配置3.配置nginx4.使用ffmpeg推流5.实时推摄像头流 本项目在开发板上使用nginx搭建流媒体服务&#xff0c;利用ffmpeg进行推流&#xff0c;在pc上使用vlc media进行拉流播放。 1.rtmp流媒体服务框架图 2.nginx配置 下载&#xff1a;wge…