42. 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.
解:开一个水量数组,记录每个column当前水高,遍历时维持一个max和maxPos,分别是最高的column的高度和编号,如果当前 i 的column比前一个高,那么就更新 [maxPos,i] 的水量,代码:
class Solution {
public:
int trap(vector<int>& height) {
int len = height.size();
if (len == 0) return 0;
int max = height[0];
int maxPos = 0;
int water = 0;
int *waterHeight = new int[len];
for (int i = 0; i < len; i++) waterHeight[i] = 0;
for (int i = 1; i < len; i++) {
if (height[i] > height[i-1]) {
if (height[i] >= max) {
for (int j = maxPos; j <= i; j++) waterHeight[j] = max;
maxPos = i;
max = height[i];
} else {
for (int j = maxPos; j <= i; j++) {
if (waterHeight[j] < height[i]) waterHeight[j] = height[i];
}
}
}
}
for (int i = 0; i < len; i++) {
if (height[i] < waterHeight[i]) water += waterHeight[i]-height[i];
}
return water;
}
};