LeetCode 75 学习计划清单和参考答案
LeetCode 75 学习计划精选 75 道经典算法题目,涵盖字符串、数组、散列、双指针、链表、树、图和动态规划等核心主题。它不仅帮助初学者快速掌握常用算法与数据结构,也能让有经验的程序员系统复习、查漏补缺。这里一次性提供针对此学习计划的进度清单和全部 75 道题的参考答案。
计划概述
力扣官网给出的 LeetCode 75 学习计划的概述:
- 精选面试必备的 75 道核心题目
- 完整面试知识点辅以逐步深入的学习顺序
- 配合抓重点式题目练习高效准备面试
- 适合需要在 3 个月以内准备面试的用户
此学习计划包含的 75 道题目的难度分布是
- \(\mathrm{\color{green}{简单}}\):22
- \(\mathrm{\color{orange}{中等}}\):53
- \(\mathrm{\color{red}{困难}}\):0
由此可见,它没有难度为困难级别的题目,很适合大专院校的在校生为申请软件实习生的职位做准备。
进度清单
针对此学习计划,笔者制作了一个进度清单(示例如下)
# | 题号 | 标题 | 分组 | 标签 | 提示 | 难度 | 完成 |
---|---|---|---|---|---|---|---|
1 | 1768 | 交替合并字符串 | 数组/字符串 | 双指针, 字符串 | 使用两个指针遍历两个字符串 | \(\mathrm{\color{green}{简单}}\) | ☐ |
2 | 1071 | 字符串的最大公因子 | 数组/字符串 | 字符串, 数学 | 使用字符串拼接和最大公因子思想 | \(\mathrm{\color{green}{简单}}\) | ☐ |
学习建议
根据笔者的经验,如果有比较好的编程经验和算法功底,实际上累计 80 个小时的刷题及复习时间也应该够了。参见上面的进度清单,笔者还给出下面的建议
- 用复选框追踪进度
- 设置每日/每周目标
- 用提示栏作为思路参考,避免直接看答案
- 注重每组题型的解题模式
- 复习题解并优化时间/空间复杂度
- 每完成一组后回顾总结
- 定期回顾已做题目,巩固理解
参考答案
下面的表格列出了笔者搜集、整理和验证的全部 75 道题的参考答案。多数是基于 Python 语言编写,一小部分用 C 语言实现。所有程序都有解释相应关键算法步骤和时间/空间复杂度的注释,绝大多数代码还包含了基本的测试用例。欢迎读者在评论区留言讨论和批评指正。
# | 题号 | 标题 | 分组 | 标签 | 提示 | 难度 | 答案 |
---|---|---|---|---|---|---|---|
1 | 1768 | 交替合并字符串 | 数组/字符串 | 双指针, 字符串 | 使用两个指针遍历两个字符串 | \(\mathrm{\color{green}{简单}}\) | Python |
2 | 1071 | 字符串的最大公因子 | 数组/字符串 | 字符串, 数学 | 使用字符串拼接和最大公因子思想 | \(\mathrm{\color{green}{简单}}\) | Python |
3 | 1431 | 拥有最多糖果的孩子 | 数组/字符串 | 数组, 贪心 | 先找最大糖果数,再遍历每个孩子 | \(\mathrm{\color{green}{简单}}\) | Python |
4 | 605 | 种花问题 | 数组/字符串 | 数组, 贪心 | 放花前检查相邻位置 | \(\mathrm{\color{green}{简单}}\) | Python |
5 | 345 | 反转字符串中的元音字母 | 数组/字符串 | 双指针, 字符串 | 使用双指针从两端遍历 | \(\mathrm{\color{green}{简单}}\) | Python |
6 | 151 | 翻转字符串里的单词 | 数组/字符串 | 双指针, 字符串 | 按空格分割并反转顺序 | \(\mathrm{\color{orange}{中等}}\) | Python |
7 | 238 | 除自身以外数组的乘积 | 数组/字符串 | 数组, 前缀和 | 使用左右乘积数组 | \(\mathrm{\color{orange}{中等}}\) | Python |
8 | 334 | 递增的三元子序列 | 数组/字符串 | 数组, 贪心 | 记录最小和次小值 | \(\mathrm{\color{orange}{中等}}\) | Python |
9 | 443 | 压缩字符串 | 数组/字符串 | 双指针, 字符串 | 统计连续字符 | \(\mathrm{\color{orange}{中等}}\) | Python |
10 | 283 | 移动零 | 双指针 | 数组, 双指针 | 用写指针放非零元素 | \(\mathrm{\color{green}{简单}}\) | Python |
11 | 392 | 判断子序列 | 双指针 | 双指针, 字符串, 动态规划 | 用双指针匹配字符 | \(\mathrm{\color{green}{简单}}\) | Python |
12 | 11 | 盛最多水的容器 | 双指针 | 数组, 双指针, 贪心 | 从两端开始,移动较短的线 | \(\mathrm{\color{orange}{中等}}\) | Python |
13 | 1679 | 和为 K 的数对最大数目 | 双指针 | 数组, 哈希表, 双指针 | 排序或用哈希表 | \(\mathrm{\color{orange}{中等}}\) | Python |
14 | 643 | 子数组最大平均数 I | 滑动窗口 | 数组, 滑动窗口 | 使用大小为 k 的滑动窗口 | \(\mathrm{\color{green}{简单}}\) | Python |
15 | 1456 | 定长子串中元音的最大数目 | 滑动窗口 | 字符串, 滑动窗口 | 滑动窗口统计元音数 | \(\mathrm{\color{orange}{中等}}\) | Python |
16 | 1004 | 最大连续 1 的个数 III | 滑动窗口 | 数组, 二分, 滑动窗口, 前缀和 | 滑动窗口最多包含 k 个零 | \(\mathrm{\color{orange}{中等}}\) | Python |
17 | 1493 | 删掉一个元素以后全为 1 的最长子数组 | 滑动窗口 | 数组, 二分, 滑动窗口 | 窗口最多允许一个零 | \(\mathrm{\color{orange}{中等}}\) | Python |
18 | 1732 | 找到最高海拔 | 前缀和 | 数组, 前缀和 | 记录累计海拔 | \(\mathrm{\color{green}{简单}}\) | Python |
19 | 724 | 寻找数组的中心下标 | 前缀和 | 数组, 前缀和 | 判断左右和是否相等 | \(\mathrm{\color{green}{简单}}\) | Python |
20 | 2215 | 找出两数组的不同 | 哈希表/集合 | 数组, 哈希表 | 用集合找唯一元素 | \(\mathrm{\color{green}{简单}}\) | Python |
21 | 1207 | 独一无二的出现次数 | 哈希表/集合 | 数组, 哈希表 | 统计频率并判断唯一性 | \(\mathrm{\color{green}{简单}}\) | Python |
22 | 1657 | 判断两个字符串是否接近 | 哈希表/集合 | 哈希表, 字符串, 排序 | 判断字符集和频率模式 | \(\mathrm{\color{orange}{中等}}\) | Python |
23 | 2352 | 相等行列对 | 哈希表/集合 | 数组, 哈希表, 矩阵, 模拟 | 行列转为可比较格式 | \(\mathrm{\color{orange}{中等}}\) | Python |
24 | 2390 | 从字符串中移除星号 | 栈 | 字符串, 栈, 模拟 | 用栈处理星号移除 | \(\mathrm{\color{orange}{中等}}\) | Python |
25 | 735 | 行星碰撞 | 栈 | 数组, 栈, 模拟 | 用栈模拟碰撞 | \(\mathrm{\color{orange}{中等}}\) | Python |
26 | 394 | 字符串解码 | 栈 | 字符串, 栈, 递归 | 用栈处理嵌套括号 | \(\mathrm{\color{orange}{中等}}\) | Python |
27 | 933 | 最近的请求次数 | 队列 | 设计, 队列, 数据流 | 用队列维护时间窗口 | \(\mathrm{\color{green}{简单}}\) | Python |
28 | 649 | Dota2 参议院 | 队列 | 字符串, 贪心, 队列 | 用两个队列分别存储两党 | \(\mathrm{\color{orange}{中等}}\) | Python |
29 | 2095 | 删除链表的中间节点 | 链表 | 链表, 双指针 | 快慢指针找中间节点 | \(\mathrm{\color{orange}{中等}}\) | C |
30 | 328 | 奇偶链表 | 链表 | 链表 | 分离奇偶位置节点 | \(\mathrm{\color{orange}{中等}}\) | C |
31 | 206 | 反转链表 | 链表 | 链表, 递归 | 迭代或递归反转 | \(\mathrm{\color{green}{简单}}\) | C |
32 | 2130 | 链表最大孪生和 | 链表 | 链表, 双指针, 栈 | 找中点,反转后半部分 | \(\mathrm{\color{orange}{中等}}\) | C |
33 | 104 | 二叉树的最大深度 | 二叉树-DFS | 树, DFS, BFS, 二叉树 | 递归或层序遍历 | \(\mathrm{\color{green}{简单}}\) | C |
34 | 872 | 叶子相似的树 | 二叉树-DFS | 树, DFS, 二叉树 | 比较叶子序列 | \(\mathrm{\color{green}{简单}}\) | Python |
35 | 1448 | 统计二叉树中好节点的数目 | 二叉树-DFS | 树, DFS, 二叉树 | 路径中记录最大值 | \(\mathrm{\color{orange}{中等}}\) | C |
36 | 437 | 路径总和 III | 二叉树-DFS | 树, DFS, 二叉树 | 用前缀和 DFS | \(\mathrm{\color{orange}{中等}}\) | C |
37 | 1372 | 二叉树中的最长交错路径 | 二叉树-DFS | 动态规划, 树, DFS, 二叉树 | 记录方向和长度 | \(\mathrm{\color{orange}{中等}}\) | C |
38 | 236 | 二叉树的最近公共祖先 | 二叉树-DFS | 树, DFS, 二叉树 | 递归查找 | \(\mathrm{\color{orange}{中等}}\) | C |
39 | 199 | 二叉树的右视图 | 二叉树-BFS | 树, DFS, BFS, 二叉树 | 层序遍历 | \(\mathrm{\color{orange}{中等}}\) | Python |
40 | 1161 | 最大层内元素和 | 二叉树-BFS | 树, BFS, 二叉树 | 层序遍历统计和 | \(\mathrm{\color{orange}{中等}}\) | Python |
41 | 700 | 二叉搜索树中的搜索 | 二叉搜索树 | 树, 二叉搜索树, 二叉树 | 利用 BST 性质高效查找 | \(\mathrm{\color{green}{简单}}\) | C |
42 | 450 | 删除二叉搜索树中的节点 | 二叉搜索树 | 树, 二叉搜索树, 二叉树 | 处理三种情况:叶子、单子节点、双子节点 | \(\mathrm{\color{orange}{中等}}\) | C |
43 | 841 | 钥匙和房间 | 图-DFS | DFS, BFS, 图 | DFS/BFS 遍历所有可达房间 | \(\mathrm{\color{orange}{中等}}\) | Python |
44 | 547 | 省份数量 | 图-DFS | DFS, BFS, 并查集, 图 | 统计连通分量 | \(\mathrm{\color{orange}{中等}}\) | Python |
45 | 1466 | 重新规划路线 | 图-DFS | DFS, BFS, 图 | 统计需要反转的边 | \(\mathrm{\color{orange}{中等}}\) | Python |
46 | 399 | 除法求值 | 图-DFS | 数组, DFS, BFS, 并查集, 图, 最短路 | 构建加权图,DFS 查询 | \(\mathrm{\color{orange}{中等}}\) | Python |
47 | 1926 | 迷宫中离入口最近的出口 | 图-BFS | 数组, BFS, 矩阵 | BFS 找到最近出口 | \(\mathrm{\color{orange}{中等}}\) | Python |
48 | 994 | 腐烂的橘子 | 图-BFS | 数组, BFS, 矩阵 | 多源 BFS 模拟 | \(\mathrm{\color{orange}{中等}}\) | Python |
49 | 215 | 数组中的第K个最大元素 | 堆/优先队列 | 数组, 分治, 排序, 堆, 快速选择 | 用大小为 k 的小顶堆或快排 | \(\mathrm{\color{orange}{中等}}\) | Python |
50 | 2336 | 无限集中的最小数字 | 堆/优先队列 | 哈希表, 设计, 堆 | 用小顶堆和集合维护 | \(\mathrm{\color{orange}{中等}}\) | Python |
51 | 2542 | 最大子序列分数 | 堆/优先队列 | 数组, 贪心, 排序, 堆 | 一维排序,另一维用堆 | \(\mathrm{\color{orange}{中等}}\) | Python |
52 | 2462 | 雇佣 K 名工人的总成本 | 堆/优先队列 | 数组, 双指针, 模拟, 堆 | 两端各用一个堆 | \(\mathrm{\color{orange}{中等}}\) | Python |
53 | 374 | 猜数字大小 | 二分查找 | 二分查找, 交互, 游戏 | 标准二分查找模板 | \(\mathrm{\color{green}{简单}}\) | Python |
54 | 2300 | 咒语和药水的成功对数 | 二分查找 | 数组, 双指针, 二分查找, 排序 | 药水排序,咒语二分查找 | \(\mathrm{\color{orange}{中等}}\) | Python |
55 | 162 | 寻找峰值 | 二分查找 | 数组, 二分查找 | 二分查找与邻居比较 | \(\mathrm{\color{orange}{中等}}\) | Python |
56 | 875 | 爱吃香蕉的珂珂 | 二分查找 | 数组, 二分查找 | 二分查找吃香蕉速度 | \(\mathrm{\color{orange}{中等}}\) | Python |
57 | 17 | 电话号码的字母组合 | 回溯 | 哈希表, 字符串, 回溯 | DFS + 数字到字母映射 | \(\mathrm{\color{orange}{中等}}\) | Python |
58 | 216 | 组合总和 III | 回溯 | 数组, 回溯 | 回溯满足和与数量限制 | \(\mathrm{\color{orange}{中等}}\) | Python |
59 | 1137 | 第 N 个泰波那契数 | 动态规划-一维 | 数学, 动态规划, 记忆化 | 迭代或记忆化递归 | \(\mathrm{\color{green}{简单}}\) | Python |
60 | 746 | 使用最小花费爬楼梯 | 动态规划-一维 | 数组, 动态规划 | 选择最小花费路径 | \(\mathrm{\color{green}{简单}}\) | Python |
61 | 198 | 打家劫舍 | 动态规划-一维 | 数组, 动态规划 | 不抢相邻房屋最大收益 | \(\mathrm{\color{orange}{中等}}\) | Python |
62 | 790 | 多米诺和托米诺平铺 | 动态规划-一维 | 动态规划 | 不同铺法状态转移 | \(\mathrm{\color{orange}{中等}}\) | Python |
63 | 62 | 不同路径 | 动态规划-多维 | 数学, 动态规划, 组合数学 | DP 或组合数学 | \(\mathrm{\color{orange}{中等}}\) | Python |
64 | 1143 | 最长公共子序列 | 动态规划-多维 | 字符串, 动态规划 | 构建二维 DP 表 | \(\mathrm{\color{orange}{中等}}\) | Python |
65 | 714 | 买卖股票的最佳时机含手续费 | 动态规划-多维 | 数组, 动态规划, 贪心 | 记录持有和卖出状态 | \(\mathrm{\color{orange}{中等}}\) | Python |
66 | 72 | 编辑距离 | 动态规划-多维 | 字符串, 动态规划 | 经典编辑距离 DP | \(\mathrm{\color{orange}{中等}}\) | Python |
67 | 338 | 比特位计数 | 位运算 | 动态规划, 位运算 | 利用位运算性质 | \(\mathrm{\color{green}{简单}}\) | Python |
68 | 136 | 只出现一次的数字 | 位运算 | 数组, 位运算 | 利用异或性质 | \(\mathrm{\color{green}{简单}}\) | Python |
69 | 1318 | 使 a 或 b 等于 c 的最少翻转次数 | 位运算 | 位运算 | 检查每一位 | \(\mathrm{\color{orange}{中等}}\) | C |
70 | 208 | 实现 Trie (前缀树) | Trie | 哈希表, 字符串, 设计, Trie | 用嵌套哈希表或数组实现 | \(\mathrm{\color{orange}{中等}}\) | Python |
71 | 1268 | 搜索推荐系统 | Trie | 数组, 字符串, Trie | 构建 Trie,遍历前缀 | \(\mathrm{\color{orange}{中等}}\) | Python |
72 | 435 | 无重叠区间 | 区间 | 数组, 动态规划, 贪心, 排序 | 按结束时间排序,贪心选择 | \(\mathrm{\color{orange}{中等}}\) | Python |
73 | 452 | 用最少数量的箭引爆气球 | 区间 | 数组, 贪心, 排序 | 按区间排序,统计不重叠区间 | \(\mathrm{\color{orange}{中等}}\) | Python |
74 | 739 | 每日温度 | 单调栈 | 数组, 栈, 单调栈 | 使用单调递减栈 | \(\mathrm{\color{orange}{中等}}\) | Python |
75 | 901 | 股票价格跨度 | 单调栈 | 栈, 设计, 单调栈, 数据流 | 栈存储(价格, 跨度)对 | \(\mathrm{\color{orange}{中等}}\) | Python |