Given n non-negative integers 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!
Difficulty: Hard
Solution: find the peak between the left and the right, which height[i] is larger than min(height[left], height[right]).
public class Solution {
public int helper(int[] height, int left, int right){
int ans = 0;
if(right - left <= 1) return 0;
int min = Math.min(height[left], height[right]);
for(int i = left + 1; i < right; i++){
if(min - height[i] > 0)
ans += min - height[i];
}
return ans;
}
public int trap(int[] height) {
int ans = 0;
int len = height.length;
if(len <= 2)
return 0;
int left = 0, right = len - 1;
while(left < len){
if(left < len - 1 && height[left + 1] < height[left]) break;
left++;
}
while(right >= 0){
if(right > 0 && height[right - 1] < height[right]) break;
right--;
}
if(right - left <= 1) return 0;
while(right - left > 1 ){
if(height[left] > height[right]){
int i = right - 1;
while(i > left){
if(height[i] >= height[right]){
ans += helper(height, i, right);
right = i;
break;
}
i--;
}
if(i == left){
ans += helper(height, left, right);
}
right = i;
}
else{
int i = left + 1;
while(i < right){
if(height[i] >= height[left]){
ans += helper(height, left, i);
left = i;
break;
}
i++;
}
if(right == i){
ans += helper(height, left, right);
}
left = i;
}
}
return ans;
}
}