42-接雨水

LeetCode接雨水问题分析&精讲 从上面的分析我们可以得出,需要找到当前柱子左右的最大值,但是一定要是最大值吗?因为当前端是低的一头,水都是从这里流走的,另外一边是不是最大值已经不重要了。从上面的代码可以看到,这里去掉了一个循环,但是复杂度的量级还是没有变化,依旧是两层for循环。当我们将思维集中在每一个柱子的时候,就能够有所发现。我们看到,整个遍历是从左到右遍历的,那么当前点左边的最大值肯定是我们遍历过的点的值,只要每次都拿最大的值就不用再去查询。遍历每个柱子,然后取这这个柱子的左右两侧最高点的小值,累加就能得到所有柱子能接多少雨水。 阅读详情

题目

给定 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

题解一 按列求

class Solution {
    public int trap(int[] height) {
        //i表示储水区,左右两侧不可能储水
        int ans=0;
        for(int i=1;i<height.length-1;i++){
            //找出左侧最高点
            int leftMax=0;
            for(int j=i-1;j>=0;j--){
                if(height[j]>leftMax){
                    leftMax=height[j];
                }
            }
            //找出右侧最高点
            int rightMax=0;
            for(int j=i+1;j<height.length;j++){
                if(height[j]>rightMax){
                    rightMax=height[j];
                }
            }
            int minHeight=Math.min(leftMax,rightMax);
            if(height[i]<minHeight){
                ans+=minHeight-height[i];
            }
        }
        return ans;
    }
}

思路:

  1. 找出左边的最高列和右边的最高列,将当前列与两端较小的最高列进行对比,只有当前列比较小列低时才能存住水。

题解二 动态规划

class Solution {
    public int trap(int[] height) {
        int[] leftMax=new int[height.length];//因为对应的是i个储水的height,所以不需要length+1
        int[] rightMax=new int[height.length];
        int ans=0;
        for(int i=1;i<height.length;i++){
            leftMax[i]=Math.max(leftMax[i-1],height[i-1]);
        }
        for(int i=height.length-2;i>=0;i--){
      	 rightMax[i]=Math.max(rightMax[i+1],height[i+1]);
        }
        for(int i=1;i<height.length-1;i++){
            int minHeight=Math.min(leftMax[i],rightMax[i]);
            if(height[i]<minHeight){
                ans+=minHeight-height[i];
            }
        }
        return ans;
    }
}

思路:

  1. 在求左右最高的墙时可以用动态规划,求出左边的墙和左边之前最高的墙哪个更高,这样就不用每次都求一次左右最高的墙了。
  2. 相当于用动态规划数组储存了每个i处的左右最高点。

题解三 双指针

class Solution {
    public int trap(int[] height) {
        int sum=0;
        int leftMax=0;
        int rightMax=0;
        int left=1;//左右指针 指示height?
        int right=height.length-2;
        for(int i=1;i<height.length-1;i++){
            if(height[left-1]<height[right+1]){
                leftMax=Math.max(leftMax,height[left-1]);
                int min=leftMax;
                if(height[left]<min){//left?两个指针,i只是用来循环的
                    sum+=min-height[left];
                }
                left++;
            }else{
                rightMax=Math.max(rightMax,height[right+1]);
                int min=rightMax;
                if(height[right]<rightMax){
                    sum+=rightMax-height[right];
                }
                right--;//注意指针移动方向--
            }
        }
        return sum;
    }
}

思路:

  1. 定理一:在某个位置i处,它能存的水,取决于它左右两边的最大值中较小的一个。

定理二:当我们从左往右处理到left下标时,左边的最大值left_max对它而言是可信的,但right_max对它而言是不可信的。(见下图,由于中间状况未知,对于left下标而言,right_max未必就是它右边最大的值)

定理三:当我们从右往左处理到right下标时,右边的最大值right_max对它而言是可信的,但left_max对它而言是不可信的。

                                   right_max
 left_max                             __
   __                                |  |
  |  |__   __??????????????????????  |  |
__|     |__|                       __|  |__
        left                      right

对于位置left而言,它左边最大值一定是left_max,右边最大值“大于等于”right_max,这时候,如果left_max<right_max成立,那么它就知道自己能存多少水了。无论右边将来会不会出现更大的right_max,都不影响这个结果。 所以当left_max<right_max时,我们就希望去处理left下标,反之,我们希望去处理right下标。

题解四 栈

class Solution {
    public int trap(int[] height) {
        int sum=0;
        Stack<Integer> stack=new Stack<>();
        int current=0;
        while(current<height.length){
            while(!stack.empty()&&height[current]>height[stack.peek()]){
                int h=height[stack.peek()];
                stack.pop();//取出栈顶的元素,栈顶元素的高度已经保存了,就可以出栈了!因为求distance不需要这个了
                if(stack.empty()){//栈空就说明目前没有比current更小的高度了,就不可能有积水了
                    break;
                }
                int distance=current-stack.peek()-1;//看当前的指针和栈顶元素之间的距离
                int min=Math.min(height[current],height[stack.peek()]);
                sum+=(min-h)*distance;//注意长*宽!
            }
            stack.push(current);//如果current元素较小的话直接入栈
            current++;
        }
        return sum;
    }
}

思路:

  1. 遇到小于栈顶高度的就入栈,大于栈顶高度的就将栈顶元素出栈,并计算之间的差值。
LeetCode 42.接雨水 给定一个包含非负整数的数组height,每个元素表示一个柱子的高度。每个柱子宽度为 1,计算按此排列的柱子,下雨之后能接多少雨水。i。 阅读详情

相关推荐

【前缀和】42. 接雨水

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

闻缺陷则喜何志丹 761

42. 接雨水

42. 接雨水 解题思路 1. 暴力 时间O(N2)O(N^2)O(N2) 空间O(1)O(1)O(1) 审题之后可以发现每个柱子顶部可以储水的高度,当前柱子的左右两侧最大高度的较小者减去当前柱子的高度。 因此我们只需要遍历每个柱子,累加每个柱子可以储水的高度即可。 参考代码1 class Solution { public int trap(int[] height) { if (height == null || height.length == 0) return 0;

org_hjh的博客 1296

告别龟速!实测Copernicus Dataspace下载Sentinel-2数据的3个提速技巧(附Workspace批量操作)

本文分享了在Copernicus Dataspace平台高效下载Sentinel-2遥感数据的3个实用技巧,包括网络传输层优化、浏览器与API调优以及Workspace批量操作。通过这些方法,用户可将下载速度提升300%以上,特别适合科研人员和团队处理大规模数据需求。

weixin_30706691的博客 180

手把手搞懂接雨水问题的多种解法

学算法认准labuladong后台回复进群一起力扣????读完本文,可以去力扣解决如下题目:42.接雨水(Hard)接雨水这道题目挺有意思,在面试题中出现频率还挺高的,本文就来步步优化...

fdl123456的博客 1779

oracle合并行---解决listagg 拼接字段返回过长 (Ora-01489 result of String concatenation is too long)

oracle合并行---解决listagg 拼接字段返回过长 (Ora-01489 result of String concatenation is too long)

清影的博客 6285

解决usbisp不识别无法烧录Atmega328P,Arduino不识别问题

如果使用Arduino IDE里面的烧录,可能会遇到一个问题,就是不识别国产这种廉价的USBISP 点击烧录引导程序,会遭遇到找不到USB设备的问题,选哪个都会提示找不到,比如选择USBasp could not find USB device with vid=0x16c0 pid=0x5dc vendor='www.fischl.de' product='USBasp' 因此,我们需要使用到progisp这一个软件的1.72版本 选择好芯片的型号后,调用编译好的HEX文...

arenascat的博客 7441

牛客网top101(接雨水问题)

接雨水问题

&1=1的博客 391

解决Windows 10安装语言包时遇到的0x800F0954错误

在安装Windows 10操作系统的语言包时,如果遇到错误代码0x800F0954的提示,这无疑会让许多用户感到困惑和无助。这个错误通常意味着在安装过程中遇到了一些阻碍,导致无法正常完成语言包的安装。本文将为大家详细解析这个错误代码0x800F0954,并提供一系列有效的解决方法,帮助大家顺利安装所需的语言包。

nntxthml的博客 3794

Leecode42——接雨水

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

qq_53507133的博客 2057

BEV感知技术全景解析:从纯视觉到多传感器融合的实战指南

本文全面解析了自动驾驶中的BEV感知技术,从纯视觉到多传感器融合的实战应用。文章深入探讨了BEV如何提供“上帝视角”,对比了IPM、Lift-Splat-Shoot及Transformer等核心实现范式,并详细阐述了多传感器融合(尤其是中融合)的工程实践与优势,为开发者提供了从理论到原型搭建的完整指南。

win55的博客 1141

主题033:燃烧反应工程

燃烧反应工程(Combustion Reaction Engineering)是研究燃料与氧化剂发生剧烈氧化反应的科学,涉及化学反应动力学、流体力学、传热传质等多个学科。燃烧是人类利用能源的主要方式,广泛应用于发电、交通运输、工业加热等领域。燃烧反应通常通过自由基链式反应进行。链引发:RH+O2⟶R⋅+HO2⋅ RH + O_2 \longrightarrow R^\cdot + HO_2^\cdot RH+O2​⟶R⋅+HO2⋅​链传递:R⋅+O2⟶RO2⋅ R^\cdot + O_2 \longrigh

kkchenjj的博客 231

lc42接雨水

通过双指针技术,我们避免了存储两个完整数组,将空间复杂度从O(n)优化至O(1),同时保持线性时间复杂度。该解法的核心在于利用左右指针的相对高度关系,动态确定当前位置的储水量由哪一侧的最大高度主导,从而实现空间效率的显著提升。

qq_35639854的博客 1030

MobaXterm简介和使用(服务器连接工具)

MobaXterm 是一个功能强大的远程计算工具,集成了许多常用的远程计算功能,包括 SSH、X11、RDP、VNC、FTP、SFTP 等。

清平乐的技术专栏 1969

【LeetCode力扣】42.接雨水(困难)

一个用木板围成的桶能装多少水取决于最短的那块木板,同理,这道题我们可以把它看做成是由若干块木板组成的一个桶,只是它们是以并排的方式组成的,这里我用left和right两个指针分别指向最左和最右的两块木板,用变量 sum 来记录总的装水量以及两个变量 leftMax和rightMax来记录左边最高的木板值和右边最高的木板值

m0_65277261的博客 1213

在Simulink中实现一个基于SiC MOSFET的高效率电机驱动系统

本文介绍了在Simulink中构建基于SiC MOSFET的高效率电机驱动系统的详细流程。系统由直流电源模块、SiC MOSFET逆变器模块、PMSM电机模型、控制策略模块(包括矢量控制和PWM生成)以及反馈测量模块组成。文章逐步指导了从模型创建到参数设置的完整过程,包括各模块的具体实现方法。通过仿真可以评估系统在不同负载条件下的响应速度、效率、功率密度等性能指标。该建模方法为电机驱动系统的设计和优化提供了有效工具,同时建议根据实际硬件规格和工程需求进行参数调整和定制化开发。

xiaoheshang_123的博客 251

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

力扣第42题:接雨水——单调栈

LeetCode第42题 接雨水 单调栈

qq_43903506的博客 3996

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

42.接雨水

对于下标 i,下雨后水能到达的最大高度等于下标 i 两边的最大高度的最小值,下标 i 处能接的雨水量等于下标 i 处的水能到达的最大高度减去 height[i]。对于 0≤i

weixin_46006714的博客 613

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

LeetCode 42接雨水

LeetCode 42接雨水 题目简述:给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。由数组 [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 思路一:暴力解法 每个矩形条上方能接受水的高度,是由它左边最高的矩形,和右边最高的矩形决定的。因此需要从当前元素开始向左扫描并更新左边矩形最大值left_max = max(le

XBlog 252

Leetcode.42 接雨水

解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。输入:height = [0,1,0,2,1,0,1,3,2,1,2,1]的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。输入:height = [4,2,0,3,2,5],要能够接到雨水,至少都需要 “三根柱子”(就看成是一根高度为 0 的柱子)。只有两根柱子,是无法接到雨水的。在去当前的栈顶元素,记作。此时的栈顶元素,记作。维护一个 单调不增的栈。

感觉画质不如...原神的博客 133

Leetcode42. 接雨水

Leetcode42. 接雨水

ProgramNovice的博客 524

LeetCode 每日一题 42. 接雨水 详细多种题解 C++描述

LeetCode 每日一题 42. 接雨水 详细多种题解 C++描述

一起加油 7520

LeetCode42接雨水问题

LeetCode42 首先,单独来看每一个柱子,每一个柱子上边能乘的雨水和三个东西有关系。左边的最大值和右边的最大值和自己的高度。用公式来表示就是: curWater = Min(lMax, rMax) - curHeight 思路清晰了之后,这道题有很多解法。比如比较麻烦的方法先遍历一遍找出最大值,之后在最大值左边和右边遍历。最大值左边的rMax就是这个最大值。这种方法需要遍历两遍。不是最优解。 还有一种方法是可以遍历一遍就出结果的。那就是单调栈。 单调栈就是维护一个“头重脚轻“的栈。如果有大于栈顶的

it_zhonghua的博客 210

Leetcode 42 接雨水

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。来源:力扣(LeetCode)个非负整数表示每个宽度为。

一点点奋斗的程序媛 1009

LeetCode42. 接雨水

LeetCode42. 接雨水

Love Peace 786

LeetCode42_接雨水

怎么接雨水?

Haolin_Liu的博客 1104
上一篇: 33-搜索旋转排序数组
下一篇: 39-组合总和
codrab
博客等级 码龄10年 15粉丝 98原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

codrab

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值