The water each bar can trap depends on the maximum height on its left and right. Thus scan twice - from left to right, and right to left and record the max height in each direction. The third time calculate the min difference between left/right height and current bar height. Sum the trapped water to get the final result.
classSolution {publicinttrap(int[] height) {if (height ==null||height.length<=2) {return0; }int ans =0;for (int i =0; i <height.length; i++) {int leftMax =0; int rightMax =0;int j = i -1;int k = i +1;int waterHeight =0;while (j >=0) { leftMax =Math.max(height[j], leftMax); j--; }while (k <height.length) { rightMax =Math.max(height[k], rightMax); k++; } waterHeight =Math.min(leftMax, rightMax); ans +=Math.max(waterHeight - height[i],0); }return ans; }}
Dynamic Programming
publicclassSolution { /** * @param heights: an array of integers * @return: a integer */publicinttrapRainWater(int[] heights) {if (heights ==null||heights.length<3) {return0; }int length =heights.length;int[] left =newint[length];int[] right =newint[length];int trapped =0;// For heights[0] or heights[length - 1], the max left/right height is 0 left[0] =0; right[length -1] =0;// Keep track of the max height on the left of height[i]for (int i =1; i < length; i++) { left[i] =Math.max(left[i -1], heights[i -1]); }// Keep track of the max height on the right of height[i]for (int j = length -2; j >=0; j--) { right[j] =Math.max(right[j +1], heights[j +1]); }// Calculate the total trapped waterfor (int k =0; k < length; k++) { trapped +=Math.max(Math.min(left[k], right[k]) - heights[k],0); }return trapped; }}