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),因为需要额外的两个数组来存储左侧和右侧的最大高度。

相关推荐
未来之窗软件服务1 小时前
自己写算法(九)网页数字动画函数——东方仙盟化神期
前端·javascript·算法·仙盟创梦ide·东方仙盟·东方仙盟算法
豐儀麟阁贵1 小时前
基本数据类型
java·算法
乐迪信息3 小时前
乐迪信息:基于AI算法的煤矿作业人员安全规范智能监测与预警系统
大数据·人工智能·算法·安全·视觉检测·推荐算法
hsjkdhs4 小时前
C++之多层继承、多源继承、菱形继承
开发语言·c++·算法
立志成为大牛的小牛4 小时前
数据结构——十七、线索二叉树找前驱与后继(王道408)
数据结构·笔记·学习·程序人生·考研·算法
星空下的曙光4 小时前
Node.js crypto模块所有 API 详解 + 常用 API + 使用场景
算法·node.js·哈希算法
StarPrayers.6 小时前
旅行商问题(TSP)(2)(heuristics.py)(TSP 的两种贪心启发式算法实现)
前端·人工智能·python·算法·pycharm·启发式算法
爱吃橘的橘猫6 小时前
嵌入式系统与嵌入式 C 语言(2)
c语言·算法·嵌入式
235166 小时前
【LeetCode】146. LRU 缓存
java·后端·算法·leetcode·链表·缓存·职场和发展
weixin_307779137 小时前
使用Python高效读取ZIP压缩文件中的UTF-8 JSON数据到Pandas和PySpark DataFrame
开发语言·python·算法·自动化·json