leecode42 接雨水

LeeCode42. 接雨水问题(经典面试题)(双指针+单调栈) 给定n个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 这道题其实很有意思,乍一看这道题其实一点思绪都没有,感觉这道题无计可施。所以对于这个问题不要看整体,要从局部入手,就单看一个存水的地方,他是不是就是min(max_left,max_right)-height[i]呢。 所以就会先想到暴力算法就是对于每一个位置都找一下max_left和max_right,然后再取一个最小值减去他的高度是不是就是这一个格子的存水量了呢。 那再进一步优化一下这个代码,... 阅读详情

在这里插入图片描述

总结

这个题感觉好难,我想不到什么好的方法,刚开始想的和后续做的只能是暴力解法,虽然做出来了,但是时间复杂度很高,最后膜拜了这个灵神的做法,灵神还是太超模了,感觉和我这个菜鸟不在一个水平

不过我虽然做的没有灵神巧妙,我的做法也是有一定的可取之处的,我的思路中最关键的一步就是对已经统计过的柱子进行抬高,防止下一轮重复。

灵神的思路主要是通过单独设置一个左挡板和右挡板对每一个柱子进行计算,最后取和。

我的思路

  1. 定义一个左指针和右指针,利用这两个指针进行遍历

    1. 首先先找到这个左指针和右指针指向位置不为0的下标,
    2. 然后我们找出这两个位置中的最小值,则我们可以先把这个中间的位置能存多少水算出来,
      统计完之后将这个柱子抬高吗,抬高是关键,因为后续可能还会统计到这个位置,必须把上一次统计造成的影响消除
      在这里插入图片描述
  2. 代码如下所示

public int trap(int[] height) {
    int len = height.length;
    int left = 0, right = len - 1;
    int ans = 0;
    int min = 0; 

    while (left < right) {
        if (height[left] == 0) {left++;continue;}
        if (height[right] == 0) {right--;continue;}
        int newMin = Math.min(height[left], height[right]);
        if (min < newMin) {
            min = newMin;
        }
        // 直接算当前区间所有 < Min 的柱子
        for (int i = left + 1; i < right; i++) {
            if (height[i] < newMin) {
                ans += newMin - height[i];
                //把这些柱子“虚拟抬高”到 newMin,下一轮不会重复加
                height[i] = newMin; 
            }
        }
        // 指针移动规则不变
        if (height[left] < height[right])
            left++;
        else
            right--;
    }
    return ans;
}

灵神的思路

灵神的思路是对于每一个块进行分析,

在这里插入图片描述

灵神第一种解法,利用两个数组进行记录

public int trap(int[] height) {
    int len = height.length;
    int[] left_max = new int[len];
    int[] right_max  = new int[len];
    left_max[0] = height[0];
    for(int i = 1;i<len;i++){
        left_max[i] = Math.max(left_max[i-1],height[i]);
    }
    right_max[len-1]=height[len-1];
    for(int i=len-2;i>=0;i--){
        right_max[i]=Math.max(right_max[i+1],height[i]);
    }
    int ans=0;
    for(int i=0;i<len;i++){
        ans+=Math.min(left_max[i],right_max[i])-height[i];
    }
    return ans;
}

灵神第二种解法,不用额外数组

  • 这个思路的关键就在于,每次当左边的挡板小于右边的挡板的时候,说明它只能够接左边挡板那么高的水,同理,当右边的挡板大于左边的挡板的时候,说明它只能够能够接右边挡板那么高的水

在这里插入图片描述

class Solution {
    public int trap(int[] height) {
        int ans = 0;
        int preMax = 0; // 前缀最大值,随着左指针 left 的移动而更新
        int sufMax = 0; // 后缀最大值,随着右指针 right 的移动而更新
        int left = 0;
        int right = height.length - 1;

        while (left < right) {
            preMax = Math.max(preMax, height[left]);
            sufMax = Math.max(sufMax, height[right]);
            if (preMax < sufMax) {
                ans += preMax - height[left];
                left++;
            } else {
                ans += sufMax - height[right];
                right--;
            }
        }
        return ans;
    }
}
作者:灵茶山艾府
链接:https://leetcode.cn/problems/trapping-rain-water/solutions/1974340/zuo-liao-nbian-huan-bu-hui-yi-ge-shi-pin-ukwm/
来源:力扣(LeetCode)
BIOS硬件监控实战:如何手动读取IT8738芯片的温度与风扇数据(附代码) 本文深入探讨了如何绕过操作系统和HWMonitor等监控软件,直接通过寄存器级操作读取IT8738超级I/O芯片的硬件监控数据。文章提供了从动态定位EC空间、构建底层读写函数到解码传感器寄存器映射的完整实战指南,并附有C语言代码示例,帮助开发者理解BIOS硬件监控的底层原理,适用于定制硬件开发与故障诊断。 阅读详情

相关推荐

6 赫斯曼网管软件industrial hivision用户管理

文章目录前言一、打开Industrial HiVision服务器二、在用户管理界面添加策略三、使用可选策略四、接受策略总结 前言 安装 Industrial HiVision 后,所有人都能广泛使用程序。安全起见,请进行相 关配置,对访问权限进行限制。 本文主要介绍用户管理基于某种角色模型。在访问角色中定义角色名称,通过分配访问权限给这些角色分配角色功能。例如,给管理人员自然要分配可用的权限,而观察员尽管可以登录,但没有能够进行更改的权限。Industrial HiVision 提供以下访问角色: 

t98746194的博客 1380

Leecode42——接雨水

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

qq_53507133的博客 2056

Oracle EBS订单的流程(Order->AR)

基本流程创建订单路径:Order Management > Orders,Returns > Sales Orders填写订单头信息,客户,订单类型,销售人员填写订单体信息,输入物料,数量...然后Book Order,订单Book之后,你会发现订单头的Status的状态变成了“Booked”,订单行的状态为"Awaiting Shipping",记录下来你的订单号,后边的每一步都需要这个订单号。

田攀的日志 4万+

leecode-42. 接雨水

leecode-接雨水,可以复习动态规划和双指针算法,并思考使用双指针算法降低动态规划算法的空间复杂度

hanxuewei666的博客 895

scratch航天梦主题课程作品分享,包含ppt、素材包

而今年多国都将发射探测器尝试登陆月球,2023年或将称为“登月年”,请大家发挥创新思维,以“星辰大海”为创作主题,搜集相关信息 、展开联想,为实现升空 、探测 、取样贡献创意!即使去淘宝买的素材,也要从百度网盘,但素材太多大了或者太多文件,也要充值百度网盘超级会员才能保存,提高下载速度。同学们大家好,今天我们就要开始航天主题-嫦娥五号探月工程系列的编程课程了,不仅可以学习到很多航天知识,了解本次嫦娥五号的发射历程,还能让我们用编程遨游太空呢。即使下载了,也要上传,不是特别方便,尤其是不好查找。

少儿编程吕口口 2481

【安装文档】TRex流量分析仪保姆级安装指南--基于VMware虚拟机(ubantu18.04@Intel 82545EM

如果之前添加了网卡,这里就可以看见有3个网卡(没添加的现在再加也行),* Active *为Linux内核正在使用的网卡,另外两张是未启用的网卡(注:未启用的网卡在终端中使用ifconfig命令是查不到的,需要先使用ip addr找出网卡,再激活,此时网卡会变为* Active *状态。

lingshengxiyou的博客 2130

【Leecode】Leecode刷题之路第42天之接雨水

1.gitee源码用相对路径在gitee可以跳转,在外部网站不可以,因此源码地址改为了绝对路径。代码示例:(Java)代码示例:(Java)代码示例:(Java)代码示例:(Java)

工一木子 543

看我如何用kali实时截获隔壁"小姐姐"的上网隐私(结尾有彩蛋)

看我如何用kali实时截获隔壁&amp;amp;amp;quot;小姐姐&amp;amp;amp;quot;的手机图片等信息(结尾有彩蛋哦) 首先圈下重点:《刑法》第二百八十五条 【非法侵入计算机信息系统罪;非法获取计算机信息系统数据、非法控制计算机信息系统罪】违反国家规定,侵入国家事务、国防建设、尖端科学技术领域的计算机信息系统的,处三年以下有期徒刑或者拘役。违反国家规定,侵入前款规定以外的计算机信息系统或者采用其他技术手段,获取该计算机信息系统中存储、处理或...

SoulCat 2万+

Leecode 42. 接雨水

题目描述: 解题思想:这个题我们可以利用局部性最佳原理,将整个数组从最左边和最右边同时比较开始, 在左半区内,水量为左边局部最大-当前深度,比如在题目给出的测试用例中 1-0 = 1,2-1=1,2-0=2,2-1=1 在右半区内,水量为右边局部最大-当前深度,比如在题目给出的测试用例中 2-1=1 所以测试用例总共可以接的雨水就是1 + 1 + 2 + 1 + 1 = 6 class ...

子冉冰清的博客 380

希捷硬盘卡死修复实战:U盘启动盘制作与低格清零全流程

机械硬盘使用多年后常出现卡顿、假死、坏道等问题,很多用户在网上搜索“希捷硬盘低格工具”或“U盘硬盘复活器”,却发现要么工具不明,要么操作不当造成二次损伤。其实所谓修复工具,本质是U盘启动环境配合硬盘检测与清零软件,低格并非修复物理坏道,而是通过全盘写零触发主控重映射,隔离不稳定扇区。懂原理后,用官方SeaTools、Ventoy/U盘启动盘、Victoria或Linux dd等组合工具,即可对可抢救的硬盘做清零修复。这一技术适用于逻辑坏道、SMART警告、扇区不稳定等场景,但需先备份数据并判断盘体是否有异响

weixin_30431445的博客 216

由浅入深的详细解读汽车PDU与BDU

本文详细解读新能源汽车的PDU高压配电单元和BDU电池包断路单元,涉及电气件参数设计、选型、结构设计、电气安全、散热设计、继电器控制与诊断,提供汽车电子知识和技术解析。

让你爱上电路设计 1万+

LeeCode 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雨水面积 = 总面积(雨水 + 黑块)- 黑块总面积 = 每层面积的和。

Java超神之路 482

AE-扭曲-变形-弧

一些AE效果的着色器实现记录

What_can_you_do的博客 1174

Leecode hot100 - 42. 接雨水

给定n个非负整数表示每个宽度为1的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。6上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。9。

2301_79601111的博客 893

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

LeeCode 42: 接雨水

题目 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。 感谢 Marcos 贡献此图。 示例: 输入: [0,1,0,2,1,0,1,3,2,1,2,1] 输出: 6 解题思路 对于每一个节...

跟心爱的人一起浪迹天涯 337

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Leecode——第42题接雨水

这个题目和上面盛水最多的容器一样,那个题目是用双指针,左右比较,如果左边小就移动左边,如果右边小就移动右边 大 暴力法: 这个题目是接雨水,可以从第一个到最后一个遍历,对于每个数。分别往左往右找到最大的值,然后取最大值的最小值减去该值就是这个位置的水量 class Solution { public: int trap(vector<int>& height) { int ans=0; for(int i=0;i<height.size()-

weixin_44730078的博客 336

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

LeeCode42.接雨水问题的详细题解

双指针法是解决接雨水问题的最优方法之一,它通过巧妙地移动指针和维护最大高度,在 O (n) 时间和 O (1) 空间内解决了问题。这种方法的核心在于理解:每个位置能接住的雨水量由其左右两侧的最大高度中较矮的那个决定。

2402_87010087的博客 454

Leecode42:接雨水

修改后成功ac,主要注意两点:一是最左端别忘记取,二是别忽视了可能中间的这个是最高的,导致不加一个判断条件的话会导致每列都被计算从而出现负值。看了下题解,发现自己的思路其实没问题,确实是按照最高最低来求,但是这个地方太复杂了求的,每一格单独求才现实。第一反应是按照高低这个思路来求解,因为可以把盛雨水的容器想成是从左往右的,遇到一个沟就存一点雨水。

MengyuyangEddy的博客 372

LeeCode( 动态编程)42_接雨水

LeeCode( 动态编程)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 提示: n == height.leng

u013456390的博客 199

一起刷Leecode-第42题-接雨水

本题是一道困难级别的题,本题在面试等情况下,是经常会被提及的,因此需要熟练掌握,该题的解法(使用C++语言实现)可以从动态规划、双指针和单调栈3种方法解决。 题目描述: 一、双指针方法 双指针方法可以以行或者列来计算。注意2者不要混。下面按照列进行计算。因为,本题中按照列来计算的话,列的宽度固定为1,只需要求出每一列雨水的高度即可。可以看出每一列雨水的高度,取决于该列左侧最高的柱子和右侧最高的柱子中最矮的那个柱子的高度减去该列柱子的高度。 1、首先第一个柱子和最后一个柱子不接水。 for(int i=0;

weixin_42419825的博客 294

leecode.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 个单位的雨水(蓝色部分表示雨水)。 思路分析 代码 class Solution { public: int trap(vector<int>& height) {

free1993的博客 167

Leecode 42.接雨水详细解题思路及算法思路

Leecode 42.接雨水详细解题及算法思路

m0_73548013的博客 161

42. 接雨水(LeeCode困难级别)

上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。解题思路:先找到最高的桶边,然后用递归分别向左和向右找另一个桶边。的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。个非负整数表示每个宽度为。

2203_75546225的博客 105

leecode 力扣刷题 #42 接雨水 (困难)

#42: 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/trapping-rain-water/ 这题属于困难,参考了解题区一位数学大佬的解题思路:https://leetcode-cn.com/problems/trapping-rain-water/solution/wei-en-tu-jie-fa-zui-jian-dan-yi-dong-1

wwwithin的博客 399

leecode42. 接雨水(单调栈+前缀和)

leecode42. 接雨水 题目描述:给n个高度不同的柱子(可为0),求能积水的容量 思路:如果俩个稍高的柱子中有一个比它们俩低的柱子,则能积水,积水的容量为最低的柱子高度-当前的柱子高度,观察样例,发现对于当前的点找到右边第一个比它高或者等于它的点,这个时候可以得出这一区间的容量,通过单调栈可以找到右边第一个比它高或者等于它的点,通过前缀和可以得出这一区间的高度和,然后进而得出这一区间的积水量.麻烦的是找到一个最高点后,后面没有比它小或者等于它的数,所以又从n为起点来一次,算它们之间区间的积水量 cla

weixin_49824291的博客 250

42. 接雨水 (Java)Leecode

解题思路: 利用双指针,左右指针同时移动,代表左右最高的柱子。 每次能装的水要与最低的水位l_max或r_max比较即可。 class Solution { public int trap(int[] height) { int left = 0, right = height.length - 1; int l_max = 0, r_max = 0; int res = 0; while(left < righ.

迪文的博客 564
上一篇: leecode611 有效三角形的个数
下一篇: leecode3 无重复元素的最长子串
TranquilGlow
博客等级 码龄5年 132粉丝 62原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值