面试知识库

双指针模板:从两端逼近到快慢指针的高频套路#

双指针的核心思想很简单:

用两个指针代替暴力枚举,让区间、位置或状态变化变得可控。

双指针并不只有一种写法,最常见的有三类:

  • 左右指针:从两端向中间逼近
  • 快慢指针:不同速度或不同职责前进
  • 同向双指针:都从左往右,但维护不同边界

⚡ 速记版模板#

// 模板用途:用两个指针协同移动,替代暴力双重枚举
int left = 0; // 左指针,通常从区间左端出发
int right = nums.length - 1; // 右指针,通常从区间右端出发
while (left < right) { // 当两指针未相遇时持续收缩/推进
    if (满足条件) { // 根据题目单调性决定移动方向
        left++; // 条件指向左指针右移
    } else {
        right--; // 否则右指针左移
    }
}
java

🎯 什么时候想到双指针?#

典型信号:

  • 数组有序,想在线性时间里找答案
  • 需要原地修改数组
  • 链表里要找中点、环、倒数第 K 个节点
  • 需要从两端收缩区间

Hot 100 里的典型题目:

💡 模板一:左右夹逼型#

适合:

  • 有序数组两数和
  • 盛水容器
  • 回文判断
  • 接雨水(双指针解法)

关键是:

  • 每次移动后,必须保证不会错过最优解
  • 所以题目的单调性或比较逻辑非常重要

💡 模板二:快慢指针型#

适合:

  • 移动零
  • 删除重复元素
  • 原地压缩数组

思路:

  • fast 负责扫描
  • slow 负责维护“下一个该放正确元素的位置”

💡 模板三:链表快慢指针型#

适合:

  • 找中点
  • 判断是否有环
  • 找倒数第 K 个节点

💡 模板四:排序 + 双指针#

适合:

  • 三数之和
  • 四数之和
  • 去重组合问题

⚠️ 易错点#

  1. 去重时机写错

    • 三数之和里,外层和内层的去重都不能漏
  2. 快慢指针职责混乱

    • 扫描归扫描,写入归写入
  3. 链表空指针判断遗漏

    • fast != null && fast.next != null 要先判断全
  4. 左右指针移动依据不充分

    • 不能凭感觉移动,要有单调性支撑

🎨 面试时怎么说#

我用双指针把原本的二重枚举压到线性扫描,关键是让一个指针负责搜索,另一个指针负责维护合法区间或有效位置。

📌 一句话总结#

双指针不是固定模板,而是一个思想:

  • 让两个指针承担不同职责
  • 用指针移动替代重复遍历