描述:
接雨水,困难题
package leetCoder;
/**
* @author : zhaoliang
* @program :newCoder
* @description : 接雨水
* @create : 2020/06/16 09:05
*/
public class LeetCode42 {
//给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
public int trap(int[] height){
int length = height.length;
int[] left = new int[length];//保存从左往右遍历时,每一个下标位置当前的最高柱子高度
int[] right = new int[length];//保存从右往左遍历时,每一个下标位置当前的最高柱子高度
int leftMax = 0;
int rightMax = 0;
int sum = 0;
//计算left和right数组
for (int i = 0; i < length; i++) {
if (height[i] > leftMax) {
leftMax = height[i];
}
left[i] = leftMax;
if (height[length-1-i] > rightMax) {
rightMax = height[length-1-i];
}
right[length-1-i] = rightMax;
}
//遍历,只有当前柱子往左看、往右看的最高柱子都比当前柱子高,才能接住雨水
for (int j = 0; j < length; j++) {
if (height[j] < left[j] && height[j] < right[j]) {
sum = sum + Math.min(left[j], right[j]) - height[j];
}
}
return sum;
}
}