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.
Example
Given [0,1,0,2,1,0,1,3,2,1,2,1]
, return 6
.
Challenge
先找出最高点, 然后分别计算left的和与right的和,因为在最高点两边, 所以互不影响。
O(n) time and O(1) memory
O(n) time and O(n) memory is also acceptable.
class Solution {
public:
/**
* @param heights: a vector of integers
* @return: a integer
*/
int trapRainWater(vector<int> &heights) {
// write your code here
if (heights.size() <= 2)
return 0;
heights.push_back(0);
heights.insert(heights.begin(), 0);
int max_h = 0;
int ind;
int sum_left = 0;
int bar_left = 0;
int sum_right = 0;
int bar_right = 0;
for (int i = 0; i < heights.size(); i++) {
if (heights[i] > max_h) {
max_h = heights[i];
ind = i;
}
}
for (int i = 0; i < ind; i++) {
if (heights[i] > bar_left) {
bar_left = heights[i];
} else {
sum_left+=(bar_left - heights[i]);
}
}
for (int i = heights.size() - 1; i > ind; i--) {
if (heights[i] > bar_right) {
bar_right = heights[i];
} else {
sum_right+=(bar_right - heights[i]);
}
}
return sum_left + sum_right;
}
};