leetcode#42

每日leetcode

Posted by Cfeng on October 9, 2019

接雨水

题目描述

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
上面是由数组 [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

思路

经典dp题,以前有一题是求能用多大的矩形覆盖,一样的思路
定义两个左右数组打表,记录当前高度最多能放多少水,需要从左往右找左边最高的(不算自己),从右往左找右边最高的也不算自己
处理完后,只要枚举一遍求和即可

Java实现

public int trap(int[] height) {
    if(height.length<3)
        return 0;
    int ans=0;
    int[] right = new int[height.length+1],left = new int[height.length+1];
    left[height.length-1]=0;
    right[0]=0;
    for(int i=1;i<height.length;i++)
        left[i] = Math.max(left[i-1],height[i-1]);
    for(int i=height.length-2;i>=0;i--)
        right[i] = Math.max(right[i+1],height[i+1]);
    for(int i=0;i<height.length;i++){
        int min_height = Math.min(left[i],right[i]);
        if (height[i]<min_height){
            ans+=(min_height-height[i]);
        }
    }
    return ans; 
}

执行用时 :1 ms, 在所有 Java 提交中击败了100.00%的用户
内存消耗 :37.9 MB, 在所有 Java 提交中击败了80.80%的用户