【leetcode hot 100 42】接雨水

错误解法:若height[left]>height[right]则代表有坑

java 复制代码
class Solution {
    public int trap(int[] height) {
        int left = 0;
        int area = 0;
        while(left<height.length-1){
            // 找坑
            int right = left+1;
            while(right<height.length-1 && height[left]>height[right]){
                right++;
            }

            // 计算第i个坑的面积
            int length_i = right-left-1;
            // 取小的那边作为高
            int height_i = height[left]<height[right]?height[left]:height[right];
            int area_i = length_i * height_i;  // 忽略里面存在石头
            // 删除里面的石头
            for(int i=left+1;i<right;i++){
                area_i = area_i - height[i];
            }

            // 加入第i个坑的面积
            area = area + area_i;

            left = right;
        }
        return area;
    }
}

注意:

  • for循环中,条件为i<num.length;但在while循环中,条件为i<num.length-1

错误原因:右边仍满足条件,但没坑

正确解法:预先计算每根柱子的左侧最高柱子(包含该柱子本身)和右侧最高柱子(包含该柱子本身),然后再一次遍历计算每个柱子能接的雨水量。

java 复制代码
class Solution {
    public int trap(int[] height) {
        // 计算每个柱子的左边最大值
        int[] leftMax = new int[height.length]; 
        leftMax[0] = height[0];
        for(int i=1; i<height.length; i++){
            leftMax[i] = Math.max(leftMax[i-1], height[i]);
        }

        // 计算每个柱子的右边最大值
        int[] rightMax = new int[height.length]; 
        rightMax[height.length-1] = height[height.length-1];
        for(int i=height.length-2; i>=0; i--){
            rightMax[i] = Math.max(rightMax[i+1], height[i]);
        } 

        // 计算每个柱子的接水量
        int area = 0;
        for(int i=0; i<height.length; i++){
            area = area + (Math.min(leftMax[i], rightMax[i]) - height[i]);
        }

        return area;
    }
}
相关推荐
数字杂技师6 小时前
每条推荐都很准,为什么我还是越刷越无聊?
算法
兰令水6 小时前
hot100【acm版】【2026.7.14打卡-java版本】
java·数据结构·算法·leetcode·面试
cpp_25017 小时前
P10098 [ROIR 2023] 地铁建设 (Day 2)
数据结构·c++·算法·贪心·二分答案·洛谷题解
thefool1122667 小时前
Java 数组是引用类型
java
阳明山水8 小时前
TimesFM与Moirai MoE零样本预测解析
人工智能·深度学习·算法·机器学习·架构
铅笔侠_小龙虾8 小时前
Rust 学习(2)-变量、常量与 shadowing
学习·算法·rust
cfm_29148 小时前
Spring监听器
java·spring boot·后端
AI科技星8 小时前
基于全域数学公理体系的三元极值题最简求解法【乖乖数学】
线性代数·算法·游戏·决策树·机器学习·乖乖数学·全域数学
SamDeepThinking8 小时前
Java面向对象在JVM里怎么实现
java·后端·面试
大鱼>8 小时前
宠物异常行为预警系统:边缘计算与实时检测
人工智能·深度学习·算法·iot·宠物