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!
?
public class Solution {
public int trap(int[] height) {
return solve(height, 0, height.length-1);
}
private int solve(int[] height, int start, int end) {
if ((start+1) >= end) {
return 0;
}
int maxIndex = -1;
int secondMaxIndex = -1;
for (int i = start; i <= end; i++) {
if (secondMaxIndex==-1 || height[i]>height[secondMaxIndex]) {
secondMaxIndex = i;
if (maxIndex==-1 || height[secondMaxIndex]>height[maxIndex]) {
int t = secondMaxIndex;
secondMaxIndex = maxIndex;
maxIndex = t;
}
}
}
int left = Math.min(secondMaxIndex, maxIndex);
int right = Math.max(secondMaxIndex, maxIndex);
int leftpart = solve(height, start, left);
int rightpart = solve(height, right, end);
int res = 0;
for (int i = left+1; i < right; i++) {
res += height[secondMaxIndex]-height[i];
}
return leftpart+res+rightpart;
}
}
?
原文:http://hcx2013.iteye.com/blog/2218805