【题干】
给定 n
个非负整数表示每个宽度为 1
的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
【思路】
每个柱子能盛水的深度,取决于min(左边最高,右边最高),想办法得到该数据求和即可。
正向遍历数组,用leftMax数组记录当前元素及其左侧的最大元素,再反向遍历数组,用rightMax数组记录当前元素及其右侧的最大元素。
遍历,ans+=max(leftMax[i],rightMax[i])-height[i]
(图解来自力扣官方题解)
【题解】
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;
}
};