NO.04 · 数据结构与算法
LeetCode 面试经典 150 题:按专题推进的 C++ 题解
按专题组织的 LeetCode 面试经典 150 题 C++ 题解——先完成数组与字符串 24 题,再推进双指针与滑动窗口,用「一个专题一组模板」的方式积累,而不是按题号散着刷。
刷题最大的浪费不是不会做,而是做完就忘。按题号散着刷,每道题都是一个孤立事件;按专题成组地刷,一组题共用一套模板——记住一组,就记住了一类。
这个仓库就是按这个思路组织的:面试经典150题/C++/ 下按专题分目录,题解从数组与字符串开始,一组一组往下推进。
目录组织方式
1 | 面试经典150题/C++/ |
文件名形如 001_88.合并两个有序数组.cpp:序号 + LeetCode 题号 + 题名。序号只表示在当前专题内的推进顺序,与难度无关;题号保证任何一个文件都能立刻对应回 LeetCode 原题。
目前的进度
| 专题 | 题数 | 代表题 |
|---|---|---|
| 数组-字符串 | 24 | 88 合并两个有序数组、26/80 删除重复项、121/122 买卖股票、55/45 跳跃游戏、42 接雨水、12/13 罗马数字互转、151 反转字符串中的单词 |
| 双指针 | 5 | 125 验证回文串、392 判断子序列、167 两数之和 Ⅱ、11 盛最多水的容器、15 三数之和 |
| 滑动窗口 | 3 | 209 长度最小的子数组、3 无重复字符的最长子串、30 串联所有单词的子串 |
为什么按专题推进
数组-字符串是专题的起点:一是题目基数最大(面试经典 150 题里占四分之一),二是它是双指针、滑动窗口、前缀和等技巧的「地基」。24 道题刷下来,反复出现的模式很清晰——
- 原地修改类(27 移除元素、26/80 删除重复项):快慢指针一个模板通吃,80 题只是多记一个计数;
- 递推类(121/122 买卖股票、55/45 跳跃游戏):I 与 II 之间只差一个状态定义;
- 双端推进类(42 接雨水):左右指针从两端向中间走,维护两侧最大值。
双指针专题则是一条递进链:125 验证回文串是单串相向而行;167 两数之和 Ⅱ 把相向双指针用到「有序数组找目标」;11 盛最多水的容器引入「移动较短边」的贪心依据;15 三数之和 = 排序 + 固定一个 + 167 的模板复用。五道题其实是同一套指针移动逻辑的不同外衣。
滑动窗口是三题定式:209 是「窗口和 ≥ target 的最短长度」,3 是「无重复字符的最长窗口」,30 是「定长窗口 + 哈希计数」。固定右端、收缩左端的骨架在三题里完全一致,差异只在窗口合法性的判定条件。
一个值得记住的细节
文件名里的连续序号不只是排序,它记录了当时的推进路径。回头看目录,等于看到自己每个专题的思考顺序——哪个专题卡得久、哪类题重复出现,一目了然。