题目
题目来源:leetcode 42:接雨水
给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
示例:
输入: [0,1,0,2,1,0,1,3,2,1,2,1]
输出: 6
解题思路
第一个和最后一个柱子上放不了雨水,其他每个柱子上能放的雨水量为max(min(leftMax, rightMax) - height[i], 0)
,height[i]
是第i+1
个柱子的高度,leftMax
是该柱子左边最高柱子的高度,rightMax
是该柱子右边最高柱子的高度。
使用双指针,left
指向第二个柱子,right
指向倒数第二个柱子,leftMax
和rightMax
分别表示left
左边最高的柱子和right
右边最高的柱子。
初始状态时,leftMax = height.front(),rightMax = height.back()
:
如果leftMax < rightMax
,就可以确定left
指向的柱子上能装多少雨水,并移动left
和更新leftMax
;反之,可以确定right
指向的柱子上能装多少雨水,并移动right
和更新rightMax
。以此类推,直到left > right
。
代码实现(C++)
class Solution {
public:
int trap(vector<int>& height) {
if (height.empty()) {
return 0;
}
int left = 1;
int right = height.size() - 2;
int leftMax = height.front();
int rightMax = height.back();
int ans = 0;
while (left <= right) {
if (leftMax < rightMax) {
ans += max(leftMax - height[left], 0);
leftMax = max(leftMax, height[left]);
++left;
}
else {
ans += max(rightMax - height[right], 0);
rightMax = max(rightMax, height[right]);
--right;
}
}
return ans;
}
};
扩展
leetcode 407:接雨水 II 将柱子扩展到了二维,要确定某个柱子上能装多少雨水,需要知道围绕它一圈的柱子的高度。