【LeetCode】42. 接雨水

该文介绍了一个计算雨水在柱子高度图中能容纳的量的问题,使用双指针方法解决。算法通过遍历数组,找到每个位置左右两侧的最大高度,计算每个柱子能接的雨水,并累加得到总雨水量。给定的Java代码实现了这一逻辑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

给定 n 个非负整数表示每个宽度为 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.length
  • 1 <= n <= 2 * 104
  • 0 <= height[i] <= 105

 

 解题思路:利用的是双指针的暴力方法,对于数组中的每个元素,我们找出下雨后水能达到的最高位置,等于两边最大高度的较小值减去当前高度的值。

大概的左边最大值和右边的最大值的理解可以参考下面这个图:

相当于是在算每一个格子它左右两边的墙最高能有多高(并不是说最靠近那一个格子的墙有多高)

 最重要的是!!!!!我们找出每一个格子下雨后水能达到的最高位置,等于两边最大高度的较小值减去当前高度的值。然后再把所有格子接的雨水总量加起来就是这个题的答案。

上代码吧,Java语言:

class Solution {
    public int trap(int[] height) {
        int left=0,right=height.length-1;
        int answer=0;
        for(int i=0;i<height.length-1;i++){
            int max_left=0,max_right=0;
            for(int j=i;j>=0;j--){//从左扫描找到最高点
                max_left=Math.max(max_left,height[j]);
            }
            for(int j=i;j<height.length;j++){
                max_right=Math.max(max_right,height[j]);
            }
            answer=answer+Math.min(max_left, max_right) - height[i];
        }//每一格子的雨水量等于两边最大高度的较小值减去当前高度的值
        return answer;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值