【算法日记】阶段大满贯:搞透大厂必考的两大核心套路(哈希表 双指针)
一路刷题通关今天咱们来做个“内功心法”大总结 在数组和字符串的算法题中有 80% 的中等/困难题都可以用两大套路来解决哈希表Hash Table和双指针Two Pointers。今天我们将结合 LeetCode 上最经典的 6 道神题彻底扒开这两个套路的底层逻辑 套路一哈希表的“降维打击” (空间换时间)【核心心法】当题目要求你“频繁查找某个元素是否存在”或者“时间复杂度要求极苛刻比如 $O(N)$”时无脑祭出哈希表unordered_map或unordered_set。它能把 $O(N)$ 的查找时间直接降维到 $O(1)$1. 寻找“命中注定的另一半”代表作[1. 两数之和]解题秘籍绝对不要用两个for循环暴力找。我们一边遍历一边算need target - 当前数。拿着need去哈希表里查查到了直接下班没查到就把自己存进表里等待后面的有缘人。2. 寻找“共有 DNA”进行分组代表作[49. 字母异位词分组]解题秘籍计算机不认识乱序词但只要我们把单词的字母排序它们就变成了相同的“DNA”比如eat和tea都变成aet。把这个 DNA 作为哈希表的 Key就能把所有异位词丢进同一个抽屉Value 数组里。3. $O(N)$ 的极限只找“排头兵”代表作[128. 最长连续序列]解题秘籍题目死磕 $O(N)$ 复杂度排序法 ($O(N \log N)$) 宣告破产。我们将数字全丢进unordered_set扫描时疯狂发问“你的前一个数字存在吗”* 如果存在说明你只是个小弟直接跳过只有前一个数字不存在时确认你是“排头兵”这才开启while循环顺藤摸瓜。用这个绝招保证每个数字最多只被摸一次⚔️ 套路二双指针魔法 (原地修改与夹击)【核心心法】当题目要求“不能使用额外空间原地修改”或者需要“在有序数组里找组合”时双指针是永远的王牌。它能把 $O(N^2)$ 的时间复杂度优雅地降到 $O(N)$。1. 同向快慢指针 (探路者与收纳箱)代表作[283. 移动零]解题秘籍两个指针从左往右一起跑。fast是探路者疯狂往前跑遇到目标非零数就发回指令。slow是收纳箱稳扎稳打只负责把fast找回来的有效数据填坑。最后把slow剩下的空位全部用0填满即可2. 对撞双指针 (左右夹击 贪心)代表作[11. 盛最多水的容器]解题秘籍这个套路不要求数组有序。左指针在头右指针在尾霸占最大宽度。然后开始灵魂拷问每次挪动哪块木板挪高木板宽度变小高度不变血亏挪矮木板宽度变小但有可能遇到极高的木板搏一搏单车变摩托结论每次无情抛弃较矮的那块木板往中间挤3. Boss级套路排序 固定一端 对撞双指针 极限去重代表作[15. 三数之和]解题秘籍找 3 个数太难直接降维第一步必须排序用一个for循环固定“大哥”第一个数。在大哥后面的区间里派出左右小弟left和right往中间夹击找总和为 0。魔鬼细节去重大哥如果和前一个大哥长得一样跳过小弟如果遇到双胞胎相邻果断跨过去这也是排序给我们带来的去重红利 总结刷算法题绝对不是死记硬背代码而是要培养“嗅觉”闻到“查找、匹配、去重、$O(N)$”的味道 ➡️掏出哈希表。闻到“原地操作、组合求和、有序数组”的味道 ➡️掏出双指针。掌握了这两大件兵器大厂面试 50% 以上的手撕代码关你都可以横着走了我们下一关见