compare_arrows双指针

双指针题型:怎么识别、怎么讲、怎么练

双指针适合处理“相对移动关系”比历史状态更重要的问题,特别是顺序、对称性、去重规则决定答案的场景。

覆盖题量

60+

推荐起手

先判断是同向双指针还是相向双指针。

高频误区

没有基于有序性证明,就随意移动错误的一边。

什么时候该想到这个模式

答案依赖于两个位置的比较,并据此决定移动哪一侧。
数组有序、局部有序,或者允许先排序再求解。
题目需要去重、分区,或者原地压缩结果。

下手前的检查清单

先判断是同向双指针还是相向双指针。
移动指针前先写出当前不变式。
如果有重复值,要明确在哪一步去重。
不要没有依据地同时移动两个指针。

真正适合面试表达的解题步骤

1

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

2

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

3

除非题意要求,否则一次只移动一侧。

4

重复值要在会造成重复答案的地方处理掉。

5

最后回看循环条件,避免漏掉最后一个有效组合。

常见变体

相向双指针

适合有序数组、容器面积、目标和等从两端逼近的问题。

快慢指针

适合环检测、原地过滤和链表遍历。

分区双指针

适合按条件或 pivot 进行分组和分区。

模板预览

Python公开预览
# 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

更像真实刷题路径的推荐题单

这组题不是随机罗列,而是按“先建立识别感,再补关键变体,最后上强度”去排,适合真的拿来做一轮 pattern 复习。

高频坑点

warning

没有基于有序性证明,就随意移动错误的一边。

warning

在 3Sum 这类题里忘记跳过重复元素。

warning

明明哈希更自然,却硬套双指针。

warning

漏掉相等元素和指针相遇时的边界情况。

练习顺序建议

1

先刷 Two Sum II 和盛最多水的容器。

2

再做 3Sum 以及重度去重的数组题。

3

然后补链表里的快慢指针题。

4

最后再做更复杂的分区和环检测混合题。

双指针题型总结 | LeetCode 高频面试模式 - Interview AiBox