# 42 - Trapping Rain Water
解法一 - DP
這個解法挺 elegant 的,個人頗推。
class Solution {
public:
int trap(vector<int>& height) {
int n = height.size();
vector<int> leftMax(n), rightMax(n);
int maxH = -1;
for(int i=0; i<n; i++) {
maxH = max(maxH, height[i]);
leftMax[i] = maxH;
}
maxH = -1;
for(int i=n-1; i>=0; i--) {
maxH = max(maxH, height[i]);
rightMax[i] = maxH;
}
int res = 0;
for(int i=0; i<n; i++) {
int trap = min(leftMax[i], rightMax[i]) - height[i];
if(trap > 0) res += trap;
}
return res;
}
};
解法二 -
class Solution {
public:
int trap(vector<int>& height) {
int l = 0, r = height.size()-1, level = 0, water = 0;
while (l < r) {
int lower = height[height[l] < height[r] ? l++ : r--];
level = max(level, lower);
water += level - lower;
}
return water;
}
};
Last updated