Given n non-negativeintegers representing an elevation map where the width of each bar is 1,compute how much water it is able to trap after raining.
For example,
Given [0,1,0,2,1,0,1,3,2,1,2,1]
, return 6
.
The above elevation map is represented by array[0,1,0,2,1,0,1,3,2,1,2,1]. In this case, 6 units of rain water (blue section)are being trapped. Thanks Marcos for contributing this image!
看完题有思路----不过还是调试了半天,主要还是自己漏了些情况。
首先取符合条件临近的两波峰,记下标为start,end写个函数subTrap(int[] height,int start,int end)求解面积。
然后是抽离子问题,我通过比较两个波峰的高度即当后一个波峰不比前一个低时抽出这两个波峰
最后考虑到数组尾部可能会出现一些奇怪的情况比如这种:
请无视我的糟糕绘图,总之就是有个位于末端的升降问题(抽离子问题基于两个波峰比较当后一个波峰不比前一个低时停止,所以会末端影响)
因为这个末端问题,我又加了各从后向前抽离子问题。
代码:
public class Solution {
public int trap(int[] height) {
if(height==null||height.length<3) return 0;
int sum = 0, start=0, end,i,left;
for (i = 0; i < height.length;) {
if (i < height.length - 1 && height[i] <= height[i + 1])
while (i < height.length - 1 && height[i] <= height[i + 1])
i++;
else {
start = i;
i++;
while (i < height.length && height[i] < height[start])
i++;
if(i==height.length) break;
end = i;
sum += subTrap(height, start, end);
}
}
if(i==height.length){
left=start;
for(i=height.length-1;i>left;){
if(i>left+1&&height[i-1]>=height[i])
while(i>=left+1&&height[i-1]>=height[i]) i--;
else{
end=i;
i--;
while(i>=left&&height[i]<height[end])
i--;
start=i;
sum+=subTrap(height,start,end);
}
}
}
return sum;
}
public int subTrap(int[] height, int start, int end) {
int min = height[start]< height[end] ? height[start] : height[end];
int sum = 0;
for (int i = start + 1; i < end; i++)
sum += min - height[i]>0?min-height[i]:0;
return sum;
}
}