反馈给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。 感谢 Marcos 贡献此图。
示例:
输入: [0,1,0,2,1,0,1,3,2,1,2,1]
输出: 6
基本思路:对于每个位置,我们只需要向2边扩展,若能找到比它的高即可接水,接水的大小为两边较小的高度减去当前高度。
因此,可以通过遍历每个位置,然后去寻找leftmax,rightmax,累加即可,这是复杂度比较高的解法,可以进行进一步优化。
我们可以使用双指针分别从两边遍历,由于能承接雨水的值是由两边中较小的数确定的,因此,那边小遍历哪边,
对于各边,在遍历过程中,更新最高的柱子高度,如果遇到比最高小的,那么代表可以承接雨水,否则更新最大高度,由于我们选择的是两边中比较小的进行遍历,那么此时另一边肯定也能承接雨水,不断循环,直到左边指针大于右边
class Solution {
public static int trap(int[] height) {
int leftmax = 0,rightmax=0;
int ans = 0;
int l = 0,r = height.length-1;
while(l<r) {
if(height[l]<height[r]) {//选择较小的一边进行遍历
if(height[l]>=leftmax) leftmax = height[l];
else ans += leftmax-height[l];
l++;
}else {
if(height[r]>=rightmax) rightmax = height[r];
else ans += rightmax-height[r];
r--;
}
}
return ans;
}
}