原题:
解决方法:
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!
解决方法:
非常棒的一道题。要求所有保存的水,我们首先需要计算每一块能够保存的水。
- 第一块和最后一块是不能保存水的,只能做墙。所有数组长度需要大于等于3。
- 对每一块来说,需要找到左边最高的墙和右边最高的墙,取两者之中的小值,如果高于当前块,则该块可以积累水。可以使用两个数组leftMax和rightMax来保存左右墙的数值。
- 从第二块开始到倒数第二块,累积计算水即可。
int trap(vector<int>& height) {
int n = height.size();
if (n < 3)
return 0;
vector<int> leftMax(n, 0), rightMax(n, 0);
leftMax[0] = height[0], rightMax[n-1] = height[n-1];
for(int i = 1; i < n; i++){
leftMax[i] = max(leftMax[i-1], height[i]);
}
for(int i = n-2; i >= 0; i--){
rightMax[i] = max(rightMax[i+1], height[i]);
}
int res = 0;
for(int i = 1; i< n-1;i++){
res += max(0, min(leftMax[i], rightMax[i]) - height[i] );
}
return res;
}