双指针算法专栏导览:从核心模型到 LeetCode 面试通关
专栏定位
本专栏面向有一定编程基础、正在备战技术面试的工程师。讨论范围严格限定于双指针算法(包含对撞指针、快慢指针、滑动窗口三大变体)及其在数组、链表场景下的应用,不涉及树/图的遍历、动态规划等其他领域。
目标:帮助读者真正理解双指针的核心直觉,而非死记硬背套路。每道题的讲解遵循”是什么 → 为什么出现 → 不这样会怎样 → 如何落地 → 边界与反例”的推导链,力求通俗易懂而不失深度。
专栏目录
| 序号 | 文章标题 | 核心话题 | 覆盖 LeetCode 题目 |
|---|
| 01 | 双指针算法全景:核心直觉、三大模型与面试考频分析 | 双指针的本质(压缩搜索空间)、三大分支、适用场景判断、复杂度证明 | 概念篇,无具体题目 |
| 02 | 对撞指针入门:有序数组中的两数之和 | 对撞指针的搜索空间消除原理、有序性前提的作用、返回下标的两种变体 | Two Sum II、Valid Palindrome、Reverse String |
| 03 | 三数之和与 N 数之和:排序+对撞指针的组合拳 | 多重对撞的”降维”思路、去重逻辑的本质、回溯框架与双指针的对比 | 3Sum、3Sum Closest、4Sum |
| 04 | 对撞指针进阶:盛水容器与接雨水的几何直觉 | Container With Most Water 的贪心论证、接雨水的左右边界预处理与双指针等价性 | Container With Most Water、Trapping Rain Water |
| 05 | 快慢指针精讲:链表成环检测与 Floyd 判圈算法 | 快慢指针的数学原理、Floyd 算法的三段证明、环长与环起点的精确计算 | Linked List Cycle、Linked List Cycle II、Happy Number |
| 06 | 链表双指针实战:倒数第 N 个节点与相交链表 | 链表”提前出发”技巧、哑节点的工程价值、相交链表的等长对齐思路 | Remove Nth Node From End of List、Intersection of Two Linked Lists、Palindrome Linked List |
| 07 | 滑动窗口基础:定长窗口与可变窗口的统一框架 | 滑动窗口为何比暴力快、定长窗口的”加一减一”维护、可变窗口的”扩张-收缩”状态机 | Maximum Average Subarray I、Minimum Size Subarray Sum、Longest Subarray of 1’s After Deleting One Element |
| 08 | 滑动窗口进阶:无重复字符与字符频次匹配 | 哈希表在窗口中的维护技巧、“至多 K 个不同字符”的抽象框架 | Longest Substring Without Repeating Characters、Permutation in String、Longest Substring with At Most Two Distinct Characters |
| 09 | 最小覆盖子串:滑动窗口的最难挑战 | 多字符频次的”满足条件”判断、formed 计数器的工程设计、收缩条件的精确建模 | Minimum Window Substring、Find All Anagrams in a String、Substring with Concatenation of All Words |
| 10 | 双指针综合通关:模式识别、算法选型与面试高频模式总结 | 三大模型的判断决策树、常见陷阱盘点、复杂度速查、面试现场心理模型 | 综合复习篇 |
专栏阅读建议
- 第 01 篇必读:理解双指针的本质(压缩搜索空间),后续所有题目的解法才有理论支撑,而不是”感觉像双指针就用双指针”
- 对撞指针篇(02-04):重点理解”有序性”是前提,不是所有两指针都叫对撞指针
- 快慢指针篇(05-06):快慢指针的核心是节奏差,建议在纸上画链表逐步模拟,体会数学推导的过程
- 滑动窗口篇(07-09):滑动窗口是可变对撞指针的特化,理解”窗口扩张条件”和”窗口收缩条件”是关键,建议用状态机思维理解
- 本专栏不覆盖:树的两指针遍历(BST 中序双指针)、图中的双向 BFS(虽然形式类似,但属于图算法范畴)
双指针适用场景速查表
| 场景特征 | 推荐模型 | 典型例题 |
|---|
| 数组/字符串,有序,找两数之和/差 | 对撞指针 | Two Sum II |
| 数组/字符串,求满足条件的连续子数组 | 滑动窗口 | Minimum Size Subarray Sum |
| 链表,检测环 | 快慢指针 | Linked List Cycle |
| 链表,找中点 | 快慢指针 | Middle of the Linked List |
| 链表,找倒数第 K 个 | 距离双指针 | Remove Nth Node From End |
| 数组,原地去重/移动零 | 同向双指针 | Remove Duplicates from Sorted Array |
| 字符串,回文判断 | 对撞指针 | Valid Palindrome |
时间复杂度收益速查表
| 暴力做法 | 双指针优化后 | 优化原理 |
|---|
| O(n2)(两重循环枚举两端点) | O(n) | 利用有序性,每次移动一端,永久消除一列搜索空间 |
| O(n2)(枚举所有子数组起终点) | O(n) | 单调性保证右端点不需要回退,窗口总移动次数为 O(n) |
| O(n)(两次遍历找链表长度再对齐) | O(n)(一次) | 快慢指针/距离指针利用节奏差,一次遍历完成 |