一维接雨水
https://leetcode.cn/problems/trapping-rain-water/
双指针解法,时间复杂度O(n),空间复杂度O(1)
某个位置的积水取决于左边界和右边界减去位置高度的最小值,因此就是寻找左边界和右边界哪个最小,但是注意这里的左边界和右边界并不是紧挨相邻的两个边界,水也有可能被更远的柱子拦住,因此左边界和有边界不应该选择紧邻的左右两边,而应该是从最左边和最右边开始逐渐往中间寻找。
class Solution:
def trap(self, height: List[int]) -> int:
if not height:
return 0
left, right = 0, len(height) - 1
left_max, right_max = height[left], height[right]
total_water = 0
while left < right:
if height[left] <= height[right]: # 这个if语句就是看左边最矮还是右边最矮,找到哪一边之后用这一边的最大值减去当前柱子的高度来计算积水
left += 1
left_max = max(left_max, height[left])
total_water += max(0, left_max - height[left])
else:
right -= 1
right_max = max(right_max, height[right])
total_water += max(0, right_max - height[right])
return total_water