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