Level:
Hard
题目描述:
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.
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!
Example:
Input: [0,1,0,2,1,0,1,3,2,1,2,1]
Output: 6
思路分析:
设置两个指针left和right,分别指向数组的首尾位置,然后从两边向中间扫描,在当前两指针确定的范围内,先比较两头找出较小值,如果较小值是left指向的值,那么就从左向右扫描,如果较小的值是right指向的值,则从右向左扫描,若遇到的值比当前较小值小,则将差值存入结果,如果遇到的值大,则重新确定新的窗口范围,以此类推直到left和right指针重合。
代码:
public class Solution{
public int trap(int[]height){
int left=0;
int right=height.length-1;
if(height==null||height.length==0)
return 0;
int res=0;
while(left<right){
int min=Math.min(height[left],height[right]); //找到两端较小的值
if(min==height[left]){
++left;
while(left<right&&height[left]<min){
res=res+min-height[left];
left++;
}
}else{
--right;
while(left<right&&height[right]<min){
res=res+min-height[right];
right--;
}
}
}
return res;
}
}