#42
Hard
双指针

Trapping Rain Water

计算柱子之间能接多少雨水。

ArrayTwo Pointers

题目定位

双指针之所以成立,是因为当另一侧边界更高时,较短一侧能接多少水已经被确定,不必再继续等待同侧更高柱子。

关键观察

当前位置能接的水由 leftMax 和 rightMax 的较小值决定,因此要移动边界较小的一侧。

目标复杂度

O(n) / O(1)

这题的解法思路怎么拆

1

双指针之所以成立,是因为当另一侧边界更高时,较短一侧能接多少水已经被确定,不必再继续等待同侧更高柱子。

2

当前位置能接的水由 leftMax 和 rightMax 的较小值决定,因此要移动边界较小的一侧。

3

先定义两个指针各自代表什么,再考虑怎么移动。

4

用当前比较结果证明哪一侧可以被安全丢弃。

参考实现

Python
# Generic pattern template
# Opposite-direction pointers on a sorted array
left, right = 0, len(nums) - 1
while left < right:
    if good(nums[left], nums[right]):
        return answer
    if should_move_left(nums[left], nums[right]):
        left += 1
    else:
        right -= 1

# Fast/slow pointers
slow = 0
for fast in range(len(nums)):
    if keep(nums[fast]):
        nums[slow] = nums[fast]
        slow += 1

常见坑点

warning

移动了错误的指针,破坏了边界证明。

warning

leftMax/rightMax 还没更新就计算接水量。

高频追问

和单调栈解法相比,概念上有什么差异?

为什么较小边界就足够决定当前蓄水量?

继续刷相关题

先把 双指针 这个模式刷成体系,再去做更难变体。

view_week回到模式页
LeetCode 42. Trapping Rain Water 题解思路 | Interview AiBox