leetcode 42. 接雨水(Java版)

题目描述(题目难度,困难)

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
leetcode 42. 接雨水(Java版)_第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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/trapping-rain-water
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题目求解

积满雨水后的图形,从左右两侧出发到最高的柱子,都是一阶阶上升的阶梯,就像爬楼梯一样。
以示例数组为例感受一下:
下雨前的数组:[0,1,0,2,1,0,1,3,2,1,2,1]
下雨后,积满雨水的数组:[0,1,1,2,2,2,2,3,2,2,2,1]
两数组之差即为所积雨水的量。
参考代码如下:

class Solution {
    public int trap(int[] height) {
        if(height == null || height.length <= 2) return 0;
    	// 找到数组中第一个最大值的下标
    	int imax = 0;
    	for(int i = 1; i < height.length; ++i){
    		if(height[i] > height[imax]) imax = i;
    	}
    	int rain = 0;
    	int v = height[0];
    	// 从左边上楼梯
    	for(int i = 1; i < imax; ++i){
    		if(height[i] < v) rain += v-height[i];
    		else v = height[i];
    	}
    	v = height[height.length-1];
    	// 从右边上楼梯
    	for(int i = height.length-2; i > imax; --i){
    		if(height[i] < v) rain += v-height[i];
    		else v = height[i];
    	}
        return rain;
    }
}

你可能感兴趣的:(算法,LeetCode,Java)