Java接雨水leetcode_42

这篇博客介绍了两种算法解决雨水填满柱子高度图的问题,包括动态规划和双指针方法。动态规划法通过维护左右两侧的最大高度来计算每个位置能接的雨水量;双指针法则通过比较左右两侧高度更新最大值,逐步计算总雨水量。这两种方法都在Java中实现了,并达到了较高的效率指标。

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

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

解法一:动态规划

class Solution {
    public int trap(int[] height) {
        int res = 0;
        int[] left_max = new int[height.length];
        int[] right_max = new int[height.length];

        //位置 i 左边最大值 
        //left_max[0] = 0
        for(int i = 1;i < height.length - 1;i++){
            left_max[i] = Math.max(left_max[i - 1],height[i - 1]);
        }
        for(int i = height.length - 2;i >= 0;i-- ){
            right_max[i] = Math.max(right_max[i + 1], height[i + 1]);
        }

        //最左最右不存水
        for(int i = 1;i < height.length - 1;i++){
            int min = Math.min(left_max[i],right_max[i]);
            if(height[i] < min){
                res += (min - height[i]);
            }
        }

        return res;
    }
}

执行用时:1 ms, 在所有 Java 提交中击败了75.74%的用户

内存消耗:42 MB, 在所有 Java 提交中击败了62.39%的用户

通过测试用例:322 / 322

解法二:双指针

public int trap(int[] height) {
    int sum = 0;
    int max_left = 0;
    int max_right = 0;
    int left = 1;
    int right = height.length - 2; // 加右指针进去
    for (int i = 1; i < height.length - 1; i++) {
        //从左到右更
        if (height[left - 1] < height[right + 1]) {
            max_left = Math.max(max_left, height[left - 1]);
            int min = max_left;
            if (min > height[left]) {
                sum = sum + (min - height[left]);
            }
            left++;
        //从右到左更
        } else {
            max_right = Math.max(max_right, height[right + 1]);
            int min = max_right;
            if (min > height[right]) {
                sum = sum + (min - height[right]);
            }
            right--;
        }
    }
    return sum;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值