题目描述:
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 Marcosfor contributing this image!
这道题是hard难度,但是如果能够将这种情境理解清楚,原理其实很简单。遍历一遍数组,找到最高的bar,那么重新从两边往中间遍历,水的高度等于当前最高高度,对于每个位置的水量等于水的高度减去bar的高度,因此只需要两次遍历即可,时间复杂度为O(n)。
class Solution {
public:
int trap(vector<int>& height) {
int max_height=0;
int index=0;
for(int i=0;i<height.size();i++)
{
if(height[i]>max_height)
{
max_height=height[i];
index=i;
}
}
int i=0;
int j=height.size()-1;
int sum=0;
int current_height=0;
while(i<index)
{
if(height[i]>current_height) current_height=height[i];
else sum+=current_height-height[i];
i++;
}
current_height=0;
while(j>index)
{
if(height[j]>current_height) current_height=height[j];
else sum+=current_height-height[j];
j--;
}
return sum;
}
};