【Leetcode 42】 接雨水

基础思路:

(1)需要将问题最小化,首先计算第i个位置最多容纳多少雨水(细长的一条水柱),然后求和就是总的雨水量;

(2)第i个位置容纳雨水量 = min(左侧最高, 右侧最高) - height[i]

进一步的:

问题转化成了,如何用最短时间计算所有位置左侧最高点和右侧最高点,这是一个简单的动态规划问题,时间复杂度O(n)

java 复制代码
public static int trap(int[] height) {
        int n = height.length;
        int result = 0;
        int[] lh = new int[n];
        int[] rh = new int[n];

        //计算左侧最高点
        int maxHeight = 0;
        for (int i = 1; i < n; i++) {
            if (height[i-1] > maxHeight) {
                maxHeight = height[i-1];
            }
            lh[i] = maxHeight;
        }

        //计算右侧最高点
        maxHeight = 0;
        for (int i = n-2; i >= 0; i--) {
            if (height[i+1] > maxHeight) {
                maxHeight = height[i+1];
            }
            rh[i] = maxHeight;
        }

        //计算每个位置的水柱,求和
        for (int i = 0; i < n; i++) {
            int wall = lh[i] > rh[i] ? rh[i] :lh[i];
            if (wall <= height[i]) {
                continue;
            }
            result += (wall - height[i]);
        }

        return result;
    }
相关推荐
雷神乐乐13 分钟前
File.separator与File.separatorChar的区别
java·路径分隔符
小刘|17 分钟前
《Java 实现希尔排序:原理剖析与代码详解》
java·算法·排序算法
jjyangyou22 分钟前
物联网核心安全系列——物联网安全需求
物联网·算法·安全·嵌入式·产品经理·硬件·产品设计
逊嘘37 分钟前
【Java语言】抽象类与接口
java·开发语言·jvm
van叶~39 分钟前
算法妙妙屋-------1.递归的深邃回响:二叉树的奇妙剪枝
c++·算法
简简单单做算法40 分钟前
基于Retinex算法的图像去雾matlab仿真
算法·matlab·图像去雾·retinex
morris13144 分钟前
【SpringBoot】Xss的常见攻击方式与防御手段
java·spring boot·xss·csp
云卓SKYDROID1 小时前
除草机器人算法以及技术详解!
算法·机器人·科普·高科技·云卓科技·算法技术
七星静香1 小时前
laravel chunkById 分块查询 使用时的问题
java·前端·laravel
Jacob程序员1 小时前
java导出word文件(手绘)
java·开发语言·word