Trapping Rain Water
扫描多遍, 从做至右求每根柱子 左最大值, 从右至左扫一遍 求右最大值.
最左边柱子maxleft=0
,最右边的柱子maxRight=0
// Trapping Rain Water
// 思路1,时间复杂度O(n),空间复杂度O(n)
class Solution {
public:
int trap(const vector<int>& A) {
const int n = A.size();
//int *left_peak = new int[n]();
//int *right_peak = new int[n]();
vector<int> left_peak(n, 0);
vector<int> right_peak(n, 0);
for (int i = 1; i < n; i++) {
left_peak[i] = max(left_peak[i - 1], A[i - 1]);
right_peak[n-1-i] = max(right_peak[n-i], A[n-i]);
}
// for (int i = n - 2; i >=0; --i) {
// right_peak[i] = max(right_peak[i+1], A[i+1]);
// }
int sum = 0;
for (int i = 0; i < n; i++) {
int height = min(left_peak[i], right_peak[i]);
if (height > A[i]) {
sum += height - A[i];
}
}
return sum;
}
};
1
Input: [0,1,0,2,1,0,1,3,2,1,2,1]
left_peak: [0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3]