问题描述:
Trapping Rain Water
有一数组代表 墙的 高度 如图,输出代表最大的存水量,求解
Input: [0,1,0,2,1,0,1,3,2,1,2,1]
Output: 6
O(n) 求解思路,
左右最大值中 较小的 减去 当前值 就是存水量
public int trap(int[] height) {
int sum =0;
if (height == null || height.length == 0 ){
return 0;
}
// 记录左边最小值
int []left = new int[height.length];
int []right = new int[height.length];
for (int i = 0; i < height.length; ++i) {
left[i] = i == 0?height[0]:Math.max(left[i-1],height[i]);
}
// 记录右边最大值
for (int i = height.length-1; i >= 0; --i) {
right[i] = (i == height.length-1)?height[i]:Math.max(right[i+1], height[i]);
}
// 记录差值的和
for (int i = 0; i < height.length; ++i) {
sum += Math.min(left[i],right[i]) - height[i];
}
return sum;
}