#11
Medium
双指针

Container With Most Water

在若干条竖线中找出能装最多水的两条。

ArrayTwo Pointers

题目定位

面积由较短边决定,所以只有移动短板那一侧才可能提升瓶颈,这个证明正是它成为经典双指针题的原因。

关键观察

移动高的一侧没有意义,因为宽度变小,而短板仍然限制高度。

目标复杂度

O(n) / O(1)

这题的解法思路怎么拆

1

面积由较短边决定,所以只有移动短板那一侧才可能提升瓶颈,这个证明正是它成为经典双指针题的原因。

2

移动高的一侧没有意义,因为宽度变小,而短板仍然限制高度。

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

误以为高度更高就一定能让面积变大。

高频追问

如果只给你一分钟,你会怎么讲正确性?

如果每条线之间的横向距离不再均匀,思路会怎么变?

继续刷相关题

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

view_week回到模式页
LeetCode 11. Container With Most Water 题解思路 | Interview AiBox