Leetcoder Day43| 单调栈2

503.下一个更大元素II

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

示例 1:

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

提示:

  • 1 <= nums.length <= 10^4
  • -10^9 <= nums[i] <= 10^9

本题和每日温度思路基本一致,多出一步对于循环数组的处理。遇到循环数组,第一个想法就是取数组长度的模,即i%len

class Solution {public int[] nextGreaterElements(int[] nums) {Stack<Integer> stack = new Stack<>();int len=nums.length;int[] res = new int[len];Arrays.fill(res, -1);for(int i=0;i<len*2;i++){while(!stack.isEmpty() && nums[stack.peek()]<nums[i%len]){res[stack.peek()]=nums[i%len];System.out.print(i+" ");System.out.println(res[stack.peek()]);stack.pop();}stack.push(i%len);}return res;}
}

42. 接雨水

给定 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 个单位的雨水(蓝色部分表示雨水)。

示例 2:

  • 输入:height = [4,2,0,3,2,5]
  • 输出:9

本题需要计算能接到多少雨水,也就是计算合理的柱子数目及其容量。合理的柱子需要满足下面的条件:

  • 同时拥有左右两侧
  • 柱子能接雨水的高度取决于矮柱子的高度

那么问题的关键在于,如何判断柱子的左右边界?如何计算容量?

首先更推荐按照列来计算容量,这样子宽度一定为1,把每一列满足条件的高度计算出来即可。

对于确定左右边界,需要分别从左和从右找到最高的列。

第一个柱子和最后一个柱子无法盛雨水

对于列1:

左边没有比当前高的柱子,所以无法盛雨水

对于列2:

  • 左边最高的柱子为列1,高度为1
  • 右边最高的柱子为列7,高度为3
  • 列2高度为0
  • 所以列2能容纳的雨水容量为:min(列1高度,列7高度)-列2高度=1-0=1

对于列3:

左边没有比它更高的柱子,所以无法盛雨水

对于列4:

  • 左边最高的柱子为列3,高度为2
  • 右边最高的柱子为列7,高度为3
  • 列4高度为1
  • 所以列4能容纳雨水容量为:min(列3高度,列7高度)-列4高度=2-1=1

以此类推。但是这个思路需要消耗O(n^2)的时间复杂度,测试用例不通过

class Solution {public int trap(int[] height) {if(height==null) return 0;int sum=0;for(int i=1;i<height.length-1;i++){int lH=height[i];int rH=height[i];for(int r=i+1;r<height.length;r++){ //找右边最大的边rH=height[r]>rH?height[r]:rH;}for(int l=i-1;l>=0;i--){// 找左边最大的边lH=height[l]>lH?height[l]:lH; }int h=Math.min(lH,rH)-height[i];if(h>0) sum+=h;}return sum;}
}

可以看到本题本质依然是寻找任一个元素的右边或者左边第一个比自己大或者小的元素的位置,接雨水这道题目,我们正需要寻找一个元素,右边最大元素以及左边最大元素,来计算雨水面积,所以还是可以考虑用到单调栈。

将本题看作求每根柱子可以容纳雨水的体积,高度为下图所示:

宽度如下图:

先将a,b,c压入栈中,此时遇到了一个比栈顶e的高度更大的c,

则e柱能容纳的水高度为min(b,c)-e,宽度为c的下标-b的下标;

b柱能容纳的雨水高度为min(a,c)-b,宽度为 c的下标-a的下标;

最后能容纳的雨水容量为高*宽

class Solution {public int trap(int[] height) {if(height==null) return 0;int sum=0;Stack<Integer> stack= new Stack<>();int len=height.length;stack.push(0);for(int i=1;i<len;i++){while(!stack.isEmpty() && height[stack.peek()]<height[i]){int top=height[stack.peek()];  //先记录栈顶元素的高度stack.pop(); //将栈顶元素弹出if(!stack.isEmpty()){//说明有左边int h=Math.min(height[stack.peek()], height[i])-top;  //计算高度int w=i-stack.peek()-1;sum+=h*w;}}stack.push(i);}return sum;}
}

84.柱状图中最大的矩形

给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为1。求在该柱状图中,能够勾勒出来的矩形的最大面积。

本题看起来和接雨水很类似,都是求面积,但是接雨水是找每个柱子左右两边第一个大于该柱子高度的柱子,分别求宽和高然后相乘,而本题是找左右两侧最近的高度小于当前高度的柱子,所以本题应该是从栈顶到栈尾单调递减栈

class Solution {public int largestRectangleArea(int[] heights) {int max=0;Stack<Integer> stack = new Stack<>();int len=heights.length;int[] newHeight = new int[len+ 2]; //定义一个新数组,加入头和尾System.arraycopy(heights, 0, newHeight, 1, len); for(int i=0;i<newHeight.length;i++){while (!stack.isEmpty() && newHeight[i] < newHeight[stack.peek()]) {//需要弹int h=newHeight[stack.peek()];stack.pop();int w=i-stack.peek()-1;max=max>h*w?max:h*w;}stack.push(i);}return max;}
}

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

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

相关文章

【chemistry 5】糖化学、脂化学和糖代谢

&#x1f31e;欢迎来到生物化学的世界 &#x1f308;博客主页&#xff1a;卿云阁 &#x1f48c;欢迎关注&#x1f389;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f31f;本文由卿云阁原创&#xff01; &#x1f4c6;首发时间&#xff1a;&#x1f339;2024年3月29日&…

Spring Cloud+Spring Alibaba笔记

Spring CloudSpring Alibaba 文章目录 Spring CloudSpring AlibabaNacos服务发现配置中心 OpenFeign超时机制开启httpclient5重试机制开启日志 SeataSentinel流量控制熔断降级热点控制规则持久化集成 OpenFeign集成 Gateway MicrometerZipKinGateway路由断言过滤器 Nacos 服务…

上海斯歌高级顾问付梁钊,受邀出席“2024企业数字化转型高峰论坛”并进行主题演讲

本文转载自公众号CIO时代网 今年政府工作报告提出&#xff0c;发展新质生产力&#xff0c;深入推进数字经济创新发展。以科技创新推动产业创新&#xff0c;加快推进新型工业化&#xff0c;提高全要素生产率&#xff0c;不断塑造发展新动能新优势&#xff0c;促进社会生产力实现…

HarmonyOS 应用开发之任务(Mission)管理场景介绍

任务&#xff08;Mission&#xff09;管理相关的基本概念如下&#xff1a; AbilityRecord&#xff1a;系统服务侧管理一个UIAbility实例的最小单元&#xff0c;对应一个应用侧的UIAbility组件实例。系统服务侧管理UIAbility实例数量上限为512个。MissionRecord&#xff1a;任务…

Postman中参数填写方式!

Postman中参数填写和请求方法有关&#xff0c;一般接口用例请求方法GET与POST常用&#xff0c;所以主要是这两种请求方法请求参数填写 一、GET请求方法参数填写 1、直接在URL中填写请求参数,如直接在URL中填写&#xff1a; http://www.example.com:8089/userapi?unamelisi&…

机器学习之聚类算法、随机森林

文章目录 随机森林决策树基础特征值问题&#xff1f; 聚类算法 随机森林 决策树 基础 概念&#xff1a;从根节点一步步走到叶子节点&#xff08;决策&#xff09;&#xff1b; 组成&#xff1a;根节点第一个选择的节点&#xff1b;叶子节点最终的决策结果&#xff1b;非叶子…

基于CNN-RNN的动态手势识别系统实现与解析

一、环境配置 为了成功实现基于CNN-RNN的动态手势识别系统&#xff0c;你需要确保你的开发环境已经安装了以下必要的库和工具&#xff1a; Python&#xff1a;推荐使用Python 3.x版本&#xff0c;作为主要的编程语言。TensorFlow&#xff1a;深度学习框架&#xff0c;用于构建…

ensp中pc机访问不同网络的服务器

拓扑图如下&#xff0c;资源已上传 说明&#xff1a;pc通过2个路由访问server服务器 三条线路分别是192.168.1.0网段&#xff0c;192.168.2.0网段和192.168.3.0网段&#xff0c;在未配置的情况下&#xff0c;pc设备是访问不到server的 具体操作流程 第一&#xff1b;pc设备…

Go语言学习Day6:数组与切片

名人说&#xff1a;莫愁千里路&#xff0c;自有到来风。 ——钱珝 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 1. 数组① 什么是数组② 数组的声明③ 初始化数组的几种方式④ 遍历数组元素⑤ 数组为值类型⑥ 数…

自动发卡平台源码优化版,支持个人免签支付

源码下载地址&#xff1a;自动发卡平台源码优化版.zip 环境要求&#xff1a; php 8.0 v1.2.6◂ 1.修复店铺共享连接时异常问题 2024-03-13 23:54:20 v1.2.5 1.[新增]用户界面硬币增款扣款操作 2.[新增]前台对接库存信息显示 3.[新增]文件缓存工具类[FileCache] 4.[新增]库存同…

Yolov8-pose关键点检测:卷积魔改 | DCNv4更快收敛、更高速度、更高性能,效果秒杀DCNv3、DCNv2等 ,助力检测

💡💡💡本文独家改进:DCNv4更快收敛、更高速度、更高性能,完美和YOLOv8结合,助力涨点 DCNv4优势:(1) 去除空间聚合中的softmax归一化,以增强其动态性和表达能力;(2) 优化存储器访问以最小化冗余操作以加速。这些改进显著加快了收敛速度,并大幅提高了处理速度,DCN…

Java并查集详解(附Leetcode 547.省份数量讲解)

一、并查集概念 并查集是一种树型的数据结构&#xff0c;用于处理一些不相交集合的合并及查询问题。 并查集的思想是用一个数组表示了整片森林&#xff08;parent&#xff09;&#xff0c;树的根节点唯一标识了一个集合&#xff0c;我们只要找到了某个元素的的树根&#xff0c;…