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!
注意:题目给出的图片具有很大迷惑性。需要注意的是,即使是局部的最高点,在全局看来,也有可能储水。如一个case{5,2,1,2,1,5}.
解题思路:
1. 先找到全局的最高点;
2. 分别从左右两边像最高点逼近。
3. 由左边向最高点逼近时,设左边当前的最大值下标为currentMax,当前遍历到i,全局最高值下边为maxIndex;
如果A[currentMax] > A[i]; sum += (A[currentMax] - A[i]);
否则,currentMax = i,此条带无法储水;
4. 由右边逼近最高点类似3.
5. 算法时间复杂度为O(n)
代码如下:
1 public int trap(int[] height) { 2 if(height.length == 0) return 0; 3 int maxIndex = 0; 4 for(int i=0; iheight[i] ? maxIndex : i); 5 6 int sum = 0; 7 //from left to right 8 int currMax = 0; 9 for(int i=0; i maxIndex; i--) {16 if(height[i] < height[currMax]) sum += (height[currMax] - height[i]);17 else currMax = i;18 }19 return sum;20 }