接雨水-力扣热题100

题目:

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

示例 1:

img

 输入: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

分析:

这道题其实画图什么的分析下来就一个公式:

当前柱子能接水的值=min(左边柱子最高值,右边柱子最高值)−当前柱子的值

让两个指向数组的left和right这两个变量即这两个指针在不相遇的时候就说明中间还有柱子没有计算,一直到两个指针相遇,那么就说明所有柱子都计算了,程序结束就好。

核心思想就是利用两个指针从两端向中间遍历,同时维护两个变量来记录从左到右和从右到左遍历时遇到的最大高度。对于数组中的每一个柱子,其能接的雨水量可以通过比较它与左侧和右侧最大高度的最小值来确定。

这是一个难度稍稍中等偏上的题目。

难点还是在于理解,只要理解了代码其实很简单。

我用的双指针法,还有栈的方法等,我感觉双指针法比较简单易于理解。

具体步骤如下:

1.初始化两个指针 left 和 right 分别指向数组的起始和结束位置,同时初始化两个变量 left_max 和 right_max 为数组的第一个和最后一个元素的高度。

2.当 left < right 时,执行以下操作:

如果 height[left] < height[right],则更新 left_max 为 max(left_max, height[left]),然后计算 left 位置的雨水量并累加到总雨水量中,接着将 left 指针向右移动。

如果 height[left] >= height[right],则更新 right_max 为 max(right_max, height[right]),然后计算 right 位置的雨水量并累加到总雨水量中,接着将 right 指针向左移动。

  1. 重复步骤2,直到 left 和 right 相遇。

 class Solution {
     public int trap(int[] height) {
         //难在理解,有个公式:
         //每个柱子能接的水的值=min(左边柱子最高值,右边柱子最高值)-当前柱子的值
         if (height == null || height.length == 0)
             return 0;
         int left = 0;
         int right = height.length - 1;
         int left_max=0,right_max=0;
         int water = 0;
 ​
         while(left<right){
             if(height[left]<height[right]){
                 left_max = Math.max(left_max,height[left]);
                 water+=left_max-height[left];
                 left++;
             }else{
                 right_max = Math.max(right_max,height[right]);
                 water+=right_max-height[right];
                 right--;
             }
         }
         return water;
     }
 }

运行结果:

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

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

相关文章

AI大模型语音识别转文字

提取音频 本项目作用在于将常见的会议录音文件、各种语种音频文件进行转录成相应的文字&#xff0c;也可从特定视频中提取对应音频进行转录成文字保存在本地。最原始的从所给网址下载对应视频和音频进行处理。下载ffmpeg(https://www.gyan.dev/ffmpeg/builds/packages/ffmpeg-…

基于微信小程序的校园点餐平台的设计与实现(源码+SQL+LW+部署讲解)

文章目录 摘 要1. 第1章 选题背景及研究意义1.1 选题背景1.2 研究意义1.3 论文结构安排 2. 第2章 相关开发技术2.1 前端技术2.2 后端技术2.3 数据库技术 3. 第3章 可行性及需求分析3.1 可行性分析3.2 系统需求分析 4. 第4章 系统概要设计4.1 系统功能模块设计4.2 数据库设计 5.…

安卓入门十一 常用网络协议四

MQTT&#xff08;Message Queuing Telemetry Transport&#xff09; MQTT是一种轻量级的、发布/订阅模式的消息传输协议。它被设计用于在低带宽或不稳定网络环境下&#xff0c;实现物联网设备之间的可靠通信。 4.1 MQTT详细介绍 发布/订阅模式&#xff1a;MQTT 使用发布/订…

前端多个项目部署在同一个nginx下,前缀不同,配置编写方式

我们前端是微前端的项目&#xff0c;不同模块是分开的不同项目&#xff0c;用访问前缀区分。开发环境部署为了节约资源&#xff0c;直接使用一个nginx当做静态资源服务器&#xff0c;服务多个微前端&#xff0c;示意图如下&#xff1a; 下面是nginx使用的配置(server部分) ser…

Yolo11 基于DroneVehicle数据集的无人机视角下车辆目标检测

1、关于DroneVehicle数据集介绍 DroneVenicle数据集是由天津大学收集、标注的大型无人机航拍车辆数据集。 DroneVehicle 数据集由无人机采集的共 56,878 幅图像组成&#xff0c;其中一半为 RGB 图像&#xff0c;其余为红外图像。我们对五个类别进行了带有方向性边界框的丰富标…

Requests库01|使用Requests库发送 get/post/put/delete请求

学习目标&#xff1a; 能够使用Requests库发送 get/post/put/delete请求&#xff0c;获取响应状态码、数据能够使用UnitTest管理测试用例。 目录 一、Requests库安装和简介 二、设置http请求语法&#xff08;重要&#xff09; 三、应用案例&#xff08;重要&#xff09; …

[有用教程]从 Pixel 快速传输到 Android

概括 更换新手机很容易&#xff0c;但数据迁移却不容易。目前&#xff0c;用户喜欢转换品牌&#xff0c;应用市场上的转换工具也越来越多。然而&#xff0c;它们并不都是安全的。因此&#xff0c;选择一款简单、安全的迁移工具至关重要。 今天我们将讨论如何从 Pixel 转移到 …

【蓝桥杯研究生组】第15届Java试题答案整理

D 题 试题 D: 商品库存管理 时间限制: 3.0s 内存限制: 512.0MB 本题总分&#xff1a;10 分 【问题描述】 在库存管理系统中&#xff0c;跟踪和调节商品库存量是关键任务之一。小蓝经营的仓库中存有多种商品&#xff0c;这些商品根据类别和规格被有序地分类并编号&#xff0c;…

BUUCTF sqli-labs 1

这里就是单纯的找一下flag在哪&#xff0c;通关整个靶场在sql注入分区&#xff0c;虽然还没有通关。 这里要先看一下数据库都有哪些&#xff0c;用到语句&#xff1a;?id-1 union select 1,(select group_concat(schema_name) from information_schema.schemata),3-- 发现这个…

python实现自动登录12306抢票 -- selenium

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 python实现自动登录12306抢票 -- selenium 前言其实网上也出现了很多12306的代码&#xff0c;但是都不是最新的&#xff0c;我也是从网上找别人的帖子&#xff0c;看B站视频&…

Spring自动化创建脚本-解放繁琐的初始化配置!!!(自动化SSM整合)

一、实现功能(原创&#xff0c;转载请告知) 1.自动配置pom配置文件 2.自动识别数据库及数据表&#xff0c;创建Entity、Dao、Service、Controller等 3.自动创建database.properties、mybatis-config.xml等数据库文件 4.自动创建spring-dao.xml spring-mvc.xml …

[微服务] - MQ高级

在昨天的练习作业中&#xff0c;我们改造了余额支付功能&#xff0c;在支付成功后利用RabbitMQ通知交易服务&#xff0c;更新业务订单状态为已支付。 但是大家思考一下&#xff0c;如果这里MQ通知失败&#xff0c;支付服务中支付流水显示支付成功&#xff0c;而交易服务中的订单…

MySQL(面试题 - 同类型归纳面试题)

目录 一、MySQL 数据类型 1. 数据库存储日期格式时&#xff0c;如何考虑时区转换问题&#xff1f; 2. Blob和text有什么区别&#xff1f; 3. mysql里记录货币用什么字段类型比较好&#xff1f; 4. MySQL如何获取当前日期&#xff1f; 5. 你们数据库是否支持emoji表情存储…

aws(学习笔记第二十一课) 开发lambda应用程序

aws(学习笔记第二十一课) 开发lambda应用程序 学习内容&#xff1a; lambda的整体概念开发lambda应用程序 1. lambda的整体概念 借助AWS Lambda&#xff0c;无需预置或管理服务器即可运行代码。只需为使用的计算时间付费。借助 Lambda&#xff0c;可以为几乎任何类型的应用进…

【优选算法】查找总价格为目标值的两个商品

链接&#xff1a;LCR 179. 查找总价格为目标值的两个商品 - 力扣&#xff08;LeetCode&#xff09; 解法&#xff1a;利用单调性&#xff0c;使用双指针算法解决问题 1.先从小到大排序 2. sum > t : right--; sum < t : left; sum t : return class Solution {public…

VUE echarts 教程二 折线堆叠图

VUE echarts 教程一 折线图 import * as echarts from echarts;var chartDom document.getElementById(main); var myChart echarts.init(chartDom); var option {title: {text: Stacked Line},tooltip: {trigger: axis},legend: {data: [Email, Union Ads, Video Ads, Dir…

bilibili 哔哩哔哩小游戏SDK接入

小游戏的文档 简介 bilibili小游戏bilibili小游戏具有便捷、轻量、免安装的特点。游戏包由云端托管&#xff0c;在哔哩哔哩APP内投放和运行&#xff0c;体验流畅&#xff0c;安全可靠。https://miniapp.bilibili.com/small-game-doc/guide/intro/ 没想过接入这个sdk比ios还难…

2024年中国新能源汽车用车发展怎么样 PaperGPT(二)

用车趋势深入分析 接上文&#xff0c;2024年中国新能源汽车用车发展怎么样 PaperGPT&#xff08;一&#xff09;-CSDN博客本文将继续深入探讨新能源汽车的用车强度、充电行为以及充电设施的现状。 用车强度 月均行驶里程&#xff1a;2024年纯电车辆月均行驶超过1500公里&…

自从学会Git,感觉打开了一扇新大门

“同事让我用 Git 提交代码&#xff0c;我居然直接把项目文件压缩发过去了……”相信很多初学者都经历过类似的窘境。而当你真正掌握 Git 时&#xff0c;才会发现它就像一本魔法书&#xff0c;轻松解决代码管理的种种难题。 为什么 Git 能成为程序员的标配工具&#xff1f;它究…

简易屏幕共享工具-基于WebSocket

前面写了两个简单的屏幕共享工具&#xff0c;不过那只是为了验证通过截屏的方式是否可行&#xff0c;因为通常手动截屏的频率很低&#xff0c;而对于视频来说它的帧率要求就很高了&#xff0c;至少要一秒30帧率左右。所以&#xff0c;经过实际的截屏工具验证&#xff0c;我了解…