leetcode-42.接雨水

dp

使用动态规划的方法来解决"接雨水"问题也是一种有效的策略。动态规划的基本思想是预先计算出每个位置的左侧和右侧的最大高度,然后根据这些预计算的结果来确定每个位置可以存储的雨水量。

动态规划方法

算法步骤
  1. 初始化

    • 创建两个数组 leftMaxrightMax,用于存储每个位置左侧和右侧的最大高度。
    • 初始化 water 为 0,用于存储总的雨水量。
  2. 计算左侧最大高度

    • 从左到右遍历高度数组,填充 leftMax 数组。
    • 对于每个位置 ileftMax[i]height[0]height[i] 的最大值。
  3. 计算右侧最大高度

    • 从右到左遍历高度数组,填充 rightMax 数组。
    • 对于每个位置 irightMax[i]height[i]height[n-1] 的最大值。
  4. 计算雨水量

    • 遍历每个位置,计算当前位置能接的雨水量为 min(leftMax[i], rightMax[i]) - height[i]
    • 将每个位置的雨水量累加到 water
  5. 返回结果

    • 返回 water,即总的雨水量。
Java 实现
java 复制代码
class Solution {
    public int trap(int[] height) {
        int ans = 0;
        int len = height.length;
        int[] dpLeft = new int[len];
        int[] dpRight = new int[len];
        // init
        dpLeft[0] = height[0];
        dpRight[len - 1] = height[len - 1];
        // core
        for (int i = 1; i < len; i++) {
            dpLeft[i] = Math.max(dpLeft[i - 1], height[i]);
        }
        for (int i = len - 2; i >= 0; i--) {
            dpRight[i] = Math.max(dpRight[i + 1], height[i]);
        }
        for (int i = 0; i < len; i++) {
            ans += Math.min(dpLeft[i], dpRight[i]) - height[i];
        }
        return ans;
    }
}

代码说明

  • 左侧最大高度数组 leftMax:用于存储每个位置左侧的最大柱子高度。
  • 右侧最大高度数组 rightMax:用于存储每个位置右侧的最大柱子高度。
  • 雨水计算 :对于每个位置,雨水量是 min(leftMax[i], rightMax[i]) - height[i],即当前位置能存储的水量。

这种方法的时间复杂度为 O(n),空间复杂度为 O(n),因为需要额外的两个数组来存储左侧和右侧的最大高度。

相关推荐
kkeeper~6 小时前
0基础C语言积跬步之数据在内存中的存储
c语言·数据结构·算法
wabs6668 小时前
关于贪心算法的一些自我总结【力扣45.跳跃游戏II】【灵感来源:代码随想录】
算法·贪心算法·复盘
2401_876964138 小时前
【湖北专升本】2026湖北专升本真题PDF+备考资料汇总
数据结构·人工智能·经验分享·深度学习·算法·计算机视觉
嗝o゚8 小时前
CANN GE 算子融合——融合算法与调度策略
算法·昇腾·cann·ge
小江的记录本9 小时前
【JVM虚拟机】垃圾回收GC:垃圾回收算法:标记-清除、标记-复制、标记-整理、分代收集(附《思维导图》+《面试高频考点清单》)
java·jvm·后端·python·算法·安全·面试
Ulyanov10 小时前
用声明式语法重新定义Python桌面UI:QML+PySide6现代开发入门(一)
开发语言·python·算法·ui·系统仿真·雷达电子对抗仿真
数据科学小丫10 小时前
特征工程处理
人工智能·算法·机器学习
z落落11 小时前
C#参数区别
java·算法·c#
c2385611 小时前
vector(下)
数据结构·算法
z落落11 小时前
C# 冒泡排序+选择排序 + Array.Sort 自定义排序
数据结构·算法