LeetCode 42. Trapping Rain Water

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Solution {
public:
int trap(vector<int>& height) {
int n = height.size();
if (n == 0) return 0;
vector<int> leftMax(n);
leftMax[0] = height[0];
for (int i = 1; i < n; ++i)
leftMax[i] = max(leftMax[i - 1], height[i]);
vector<int> rightMax(n);
rightMax[n - 1] = height[n - 1];
for (int i = n - 2; i >= 0; --i)
rightMax[i] = max(rightMax[i + 1], height[i]);
int ans = 0;
for (int i = 0; i < n; ++i)
ans += min(leftMax[i], rightMax[i]) - height[i];
return ans;
}
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Solution {
public:
int trap(vector<int>& height) {
int n = height.size();
stack<int> stk;
int ans = 0;
for (int i = 0; i < n; ++i) {
while (!stk.empty() && height[i] > height[stk.top()]) {
int top = stk.top(); stk.pop();
if (stk.empty()) break;
int left = stk.top();
int currWidth = i - left - 1;
int currHeight = min(height[i], height[left]) - height[top];
ans += currWidth * currHeight;
}
stk.push(i);
}
return ans;
}
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class Solution {
public:
int trap(vector<int>& height) {
int n = height.size();
if (n < 3) return 0;
int left = 0, right = n - 1, leftMax = 0, rightMax = 0;
int ans = 0;
while (left < right) {
if (height[left] < height[right]) {
if (height[left] < leftMax)
ans += leftMax - height[left];
else
leftMax = height[left];
++left;
} else {
if (height[right] < rightMax)
ans += rightMax - height[right];
else
rightMax = height[right];
--right;
}
}
return ans;
}
};