力扣刷题笔记《动态规划篇》→ 42. 接雨水

206 阅读1分钟

这是我参与8月更文挑战的第24天,活动详情查看:8月更文挑战

题目

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

示例

42. 接雨水 示例 1.png

输入: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 个单位的雨水(蓝色部分表示雨水)。 

输入: height = [4,2,0,3,2,5]
输出: 9

提示

  • n == height.length
  • 0 <= n <= 3 * 10410^4
  • 0 <= height[i] <= 10510^5

解题思路

这题目跟《盛最多水的容器》有点类似,也是要计算出中级的雨水量,那么在这里我们也可以采用类似于双指针的思路来进行推导。

  • 定义数组 left[], 用来保存从左往右的最大高度

left.gif

  • 定义数组 right[], 用来保存从右往左的最大高度

right.gif

  • 再去两者较短的边,减去当前位置柱子的高度,即可计算出雨水量

image.png

代码实现

方法一:动态规划

class Solution {
    public int trap(int[] height) {
        int n = height.length;
        if(0 == n){
            return 0;
        }

        // 取得左边高度虚拟面积
        int[] left = new int[n];
        left[0] = height[0];
        for(int i = 1; i < n; ++i){
            left[i] = Math.max(left[i - 1], height[i]);
        }

        // 取得右边高度虚拟面积
        int[] right = new int[n];
        right[n - 1] = height[n - 1];
        for(int i = n - 2; i >= 0; --i){
            right[i] = Math.max(right[i + 1], height[i]);
        }

        // 统计雨水量
        int res = 0;
        for(int i = 0; i < n; ++i){
            res += Math.min(left[i], right[i]) - height[i];
        }

        // 返回结果
        return res;
    }
}

复杂度分析

  • 时间复杂度:O(N)O(N)
  • 空间复杂度:O(N)O(N)

最后

文章有写的不好的地方,请大佬们不吝赐教,错误是最能让人成长的,愿我与大佬间的距离逐渐缩短!

如果觉得文章对你有帮助,请 点赞、收藏、关注、评论 一键四连支持,你的支持就是我创作最大的动力!!!

题目出处: leetcode-cn.com/problems/tr…