一、数组:双指针是 “万能钥匙”
数组题占了近一半,而双指针是解决这类题的 “最优解密码”。
1. 左右指针:解决 “区间类” 问题
- 11. 盛最多水的容器考点:双指针 + 贪心思路:用左右指针指向数组两端,计算当前容器面积;每次移动较矮的指针(因为移动高指针只会让容器更矮),更新最大面积。
- 15. 三数之和/16. 最接近的三数之和考点:排序 + 双指针思路:先排序数组,固定一个数后用左右指针找另外两个数,避免三重循环;注意去重(三数之和)或更新最小差值(最接近的三数之和)。
2. 快慢指针:解决 “原地修改” 问题
- 26. 删除有序数组中的重复项考点:快慢指针思路:慢指针记录新数组的末尾,快指针遍历原数组;快指针遇到与慢指针不同的数,就把它放到慢指针的下一位,慢指针后移。
- 27. 移除元素考点:快慢指针思路:类似上题,慢指针存 “保留元素”,快指针遍历数组;遇到目标值就跳过,否则放到慢指针位置。
二、字符串:哈希表 + 栈 + 匹配算法是核心
字符串题的关键是字符映射和结构匹配。
1. 哈希表:处理 “字符 - 数值” 映射
- 12. 整数转罗马数字/13. 罗马数字转整数考点:哈希表映射思路:把罗马数字与数值的对应关系存在哈希表中;整数转罗马时,从大到小匹配数值,拼接字符;罗马转整数时,遍历字符串,若当前字符值小于后一个,就减去当前值,否则加上。
2. 栈:解决 “括号匹配” 问题
- 20. 有效的括号考点:栈的 “后进先出” 特性思路:遇到左括号入栈,遇到右括号就弹出栈顶元素对比;最后栈为空且所有括号匹配则有效。
3. 前缀 / 匹配:基础遍历 + KMP 算法
- 14. 最长公共前缀考点:字符串遍历思路:以第一个字符串为基准,逐个字符与其他字符串对比,直到出现不匹配的字符,前面的部分就是最长公共前缀。
- 28. 找出字符串中第一个匹配项的下标考点:字符串匹配(暴力 / KMP)思路:暴力法是逐个字符对比子串;优化用 KMP 算法,先构建子串的前缀表,再利用前缀表跳过重复匹配,降低时间复杂度。
三、链表:虚拟头节点是 “神器”
链表题的核心是指针操作,虚拟头节点能避免边界问题。
- 21. 合并两个有序链表考点:链表遍历 + 虚拟头节点思路:创建虚拟头节点,用两个指针分别遍历两个链表,每次把较小的节点接在虚拟头节点的后面,直到其中一个链表遍历完,再把剩下的部分接上去。