手撕算法-接雨水

描述

分析

i位置能积累的雨水量,等于其左右两边最大高度的最小值。

为了能获取i位置左右两边的最大高度。使用动态规划。

两个dp数组:

  • leftMax
  • rightMax

其中

  • leftMax[i] 代表i位置左边的最大高度
  • rightMax[i] 代表i位置右边的最大高度

初始状态:

  • leftMax[0] = 0;
  • rightMax[0] =0;

填充这两个dp数组。

那么i位置最终能存的雨水量为:min(eftMax[i] , rightMax[i]) - height[i]

遍历所有位置,即可得到总共能接的雨水数。

代码

java 复制代码
class Solution {
    public int trap(int[] height) {
        int n = height.length;
        int[] leftMax = new int[n];
        int[] rightMax = new int[n];

        leftMax[0] = height[0];
        for (int i = 1; i < n; i++) {
            leftMax[i] = Math.max(leftMax[i - 1], height[i]);
        }

        rightMax[n - 1] = height[n - 1];
        for (int i = n - 2; i >= 0; i--) {
            rightMax[i] = Math.max(rightMax[i + 1], height[i]);
        }

        int res = 0;
        for (int i = 0; i < n; i++) {
            res += Math.min(leftMax[i], rightMax[i]) - height[i];
        }

        return res;
    }
}

面试公司

相关推荐
神经网络的应用34 分钟前
C++程序设计例题——第三章程序控制结构
c++·学习·算法
南宫生1 小时前
力扣-数据结构-3【算法学习day.74】
java·数据结构·学习·算法·leetcode
-$_$-2 小时前
【LeetCode 面试经典150题】详细题解之滑动窗口篇
算法·leetcode·面试
Channing Lewis2 小时前
算法工程化工程师
算法
帅逼码农3 小时前
有限域、伽罗瓦域、扩域、素域、代数扩张、分裂域概念解释
算法·有限域·伽罗瓦域
Jayen H3 小时前
【优选算法】盛最多水的容器
算法
机跃3 小时前
递归算法常见问题(Java)
java·开发语言·算法
<但凡.3 小时前
题海拾贝:蓝桥杯 2020 省AB 乘法表
c++·算法·蓝桥杯
pzx_0013 小时前
【LeetCode】94.二叉树的中序遍历
算法·leetcode·职场和发展
我曾经是个程序员3 小时前
使用C#生成一张1G大小的空白图片
java·算法·c#