/*方法一:对于每个柱子A[i],假设它左右边最高的柱子分别为A[l]和
A[r],那么对于i柱子存储的水为max(A[l], A[r]) - A[i]。可以采用
递归的方法求解每个柱子的左右最大值:
1.从左往右扫描,获取每个柱子左边柱子中的最大值;
2.从右往左扫描,获取每个柱子右边柱子中的最大值;
方法参考自: https://github.com/soulmachine/leetcode*/
class Solution {
public:
int trap(int A[], int n) {
vector<int> left_max(n, 0);
vector<int> right_max(n, 0);
//从左往右扫描
for(int i = 1; i < n; ++i) left_max[i] = max(left_max[i-1], A[i-1]);
//从右往左扫描
for(int i = n-2; i >= 0; --i) right_max[i] = max(right_max[i+1], A[i+1]);
int res(0);
for(int i = 1; i < n-1; ++i)
res += min(left_max[i], right_max[i]) > A[i] ?
min(left_max[i], right_max[i]) - A[i] : 0;
return res;
}
};
LeetCode之Trapping Rain Water
最新推荐文章于 2021-08-02 13:10:36 发布