问题描写
Trapping Rain Water
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!
问题分析
这道题目解题思路可以参考leetcode011:Container With Most Water 的分析,leetcode011是求围住的最大面积,这里有所区分,统计“装水”面积,还是从两边向中间扫描,时间复杂度O(n)。 这里设置1个水平面h,表示当前围住的高度,如果后续扫面到的比h低,说明可以装水,统计;如果比h高,更新h便可。
代码
//运行时间:13ms
class Solution {
public:
int trap(vector<int>& height) {
int i = 0, j = height.size()⑴;
int ans = 0;
int h = 0;
while (j-i >= 0){
if (height[i] > height[j]){
if (height[j] <= h){
ans += (h - height[j]);
}
else{
h = height[j];
}
j--;
}
else if (height[i] < height[j]){
if (height[i] <= h){
ans += (h - height[i]);
i++;
}
else{
h = height[i];
}
}
else{
if (height[i] <= h){
if (i != j)
ans += 2 * (h - height[i]);
else
ans += (h - height[i]);
}
else{
h = height[i];
}
i++; j--;
}
}
return ans;
}
};