
LeetCode 题解仓库·中等难度题目合集分类刷题路线、核心算法拆解与 125 道经典题索引【免费下载链接】leetcodeLeetCode Solutions: A Record of My Problem Solving Journey.( leetcode题解记录自己的leetcode解题之路。)项目地址: https://gitcode.com/gh_mirrors/le/leetcode本文以collections/medium.md中等难度题目合集为骨架将仓库作者十余年刷题沉淀的 125 道中等经典题按算法主题重新编排并结合仓库内每题题解源码如 15. 三数之和、61. 旋转链表、875. 爱吃香蕉的珂珂、322. 零钱兑换与 thinkings/ 专题讲义 逐类拆解。读完本文你将获得一份可直接按主题推进的中等题刷题清单、中等题两大难点的应对策略以及每个分类背后的通用算法模板与仓库内对应的精讲入口。一、为什么中等题才是刷题的主战场在 LeetCode力扣中中等难度题目占比最大。仓库作者在 collections/medium.md 中给出的判断非常明确中等题目是力扣比例最大的部分因此这部分我的题解也是最多的。大家不要太过追求难题先把中等难度题目做熟了再说。与之对应的是仓库 README.md 把全部题解划分为简单、中等、困难三档见 collections/easy.md、collections/medium.md、collections/hard.md其中中等档收录的题解数量最多覆盖了数组、链表、树、动态规划、二分、回溯、图论、设计题等全部核心类型。可以说中等题是检验算法基本功是否扎实的分水岭简单题往往一眼看穿困难题往往需要多算法组合而中等题恰好处于需要想明白但想明白就能写对的位置。二、中等题的两大难点与应对策略作者在文档中把中等题的本质归纳为两类并给出了对应的训练方法2.1 难点一需要挖掘题目的内含信息抽象成简单题很多中等题是套着复杂外衣的简单题。比如 15. 三数之和 的核心思路是分治——先固定一个数问题立刻降维成在数组中找两数之和等于给定值而这正是简单题 1. 两数之和 的变体// 摘自 problems/15.3sum.md var threeSum function (nums) { if (nums.length 3) return []; const list []; nums.sort((a, b) a - b); for (let i 0; i nums.length; i) { if (nums[i] 0) break; // 排序后首个元素 0后续不可能凑成 0 if (i 0 nums[i] nums[i - 1]) continue; // 跳过重复结果无需 set let left i 1; let right nums.length - 1; while (left right) { if (nums[left] nums[right] nums[i] 0) { list.push([nums[left], nums[right], nums[i]]); while (nums[left] nums[left 1]) left; // 跳过重复 left; while (nums[right] nums[right - 1]) right--; // 跳过重复 right--; } else if (nums[left] nums[right] nums[i] 0) { right--; } else { left; } } } return list; };题解中作者明确点出了这套思路的精髓在这里之所以要排序解决是因为我们算法的瓶颈在这里不在于排序而在于 O(N²)见 problems/15.3sum.md 思路部分。排序的代价是 O(N log N)而双层指针扫描是 O(N²)瓶颈在后者因此排序可以放心用。复杂度分析见 problems/15.3sum.md时间复杂度 O(N²)空间复杂度取决于排序算法的空间消耗。2.2 难点二编码能力不过关另一类中等题写起来比较麻烦例如链表指针操作、边界条件极多的模拟题很多人思路对了却写挂。作者给出的药方非常朴素且重要因此大家一定要自己做即使看了题解会了也要自己码一遍。自己不亲自写一遍里面的细节永远不知道。这与仓库 91 天学算法 活动的理念一脉相承学习算法要靠积累强制打卡、高强度练习才能在 91 天后遇见更好的自己。该活动配套讲义 第一期讲义-二分法、第一期讲义-双指针 等本身就是针对中等题高频考点的专题总结。三、125 道经典中等题按算法主题分类索引原文档 collections/medium.md 以题号顺序罗列了全部经典题目。为便于按主题集中突破本文将其重新编排为 12 个算法分类题目与链接与原文档一一对应、无一遗漏。标注(91)表示该题出自91 天学算法活动活动介绍标注为原文档中新增收录的题目。3.1 数组与双指针16 题题号题目链接11盛最多水的容器problems/11.container-with-most-water.md15三数之和problems/15.3sum.md31下一个排列problems/31.next-permutation.md48旋转图像problems/48.rotate-image.md73矩阵置零problems/73.set-matrix-zeroes.md75颜色分类problems/75.sort-colors.md80删除排序数组中的重复项 IIproblems/80.remove-duplicates-from-sorted-array-ii.md209长度最小的子数组problems/209.minimum-size-subarray-sum.md238除自身以外数组的乘积problems/238.product-of-array-except-self.md611有效三角形的个数problems/611.valid-triangle-number.md978最长湍流子数组problems/978.longest-turbulent-subarray.md1014最佳观光组合problems/1014.best-sightseeing-pair.md1031两个非重叠子数组的最大和problems/1031.maximum-sum-of-two-non-overlapping-subarrays.md1131绝对值表达式的最大值problems/1131.maximum-of-absolute-value-expression.md1574删除最短的子数组使剩余数组有序problems/1574.shortest-subarray-to-be-removed-to-make-array-sorted.md1658将 x 减到 0 的最小操作数problems/1658.minimum-operations-to-reduce-x-to-zero.md3.2 链表10 题题号题目链接2两数相加problems/2.add-two-numbers.md19删除链表的倒数第 N 个节点problems/19.removeNthNodeFromEndofList.md24两两交换链表中的节点problems/24.swapNodesInPairs.md61旋转链表 (91)problems/61.Rotate-List.md86分隔链表problems/86.partition-list.md92反转链表 IIproblems/92.reverse-linked-list-ii.md147对链表进行插入排序problems/147.insertion-sort-list.md328奇偶链表problems/328.odd-even-linked-list.md445两数相加 IIproblems/445.add-two-numbers-ii.md1019链表中的下一个更大节点problems/1019.next-greater-node-in-linked-list.md3.3 哈希表与前缀和9 题题号题目链接49字母异位词分组problems/49.group-anagrams.md229求众数 IIproblems/229.majority-element-ii.md380常数时间插入、删除和获取随机元素problems/380.insert-delete-getrandom-o1.md454四数相加 IIproblems/454.4-sum-ii.md560和为 K 的子数组problems/560.subarray-sum-equals-k.md609在系统中查找重复文件problems/609.find-duplicate-file-in-system.md820单词的压缩编码problems/820.short-encoding-of-words.md1297子串的最大出现次数problems/1297.maximum-number-of-occurrences-of-a-substring.md1371每个元音包含偶数次的最长子字符串problems/1371.find-the-longest-substring-containing-vowels-in-even-counts.md说明560、1371 两题的核心是前缀和 哈希表组合——用哈希表记录前缀状态出现过的位置/次数从而把子数组问题转为 O(1) 查询。作者在 精选合集 中有专门的前缀和专题总结。3.4 二叉树17 题题号题目链接94二叉树的中序遍历problems/94.binary-tree-inorder-traversal.md95不同的二叉搜索树 IIproblems/95.unique-binary-search-trees-ii.md96不同的二叉搜索树problems/96.unique-binary-search-trees.md98验证二叉搜索树problems/98.validate-binary-search-tree.md102二叉树的层序遍历problems/102.binary-tree-level-order-traversal.md103二叉树的锯齿形层次遍历problems/103.binary-tree-zigzag-level-order-traversal.md113路径总和 IIproblems/113.path-sum-ii.md129求根到叶子节点数字之和problems/129.sum-root-to-leaf-numbers.md144二叉树的前序遍历problems/144.binary-tree-preorder-traversal.md199二叉树的右视图problems/199.binary-tree-right-side-view.md230二叉搜索树中第 K 小的元素problems/230.kth-smallest-element-in-a-bst.md236二叉树的最近公共祖先problems/236.lowest-common-ancestor-of-a-binary-tree.md337打家劫舍 IIIproblems/337.house-robber-iii.md513找树左下角的值 (91)problems/513.find-bottom-left-tree-value.md987二叉树的垂序遍历 (91)problems/987.vertical-order-traversal-of-a-binary-tree.md1104二叉树寻路problems/1104.path-in-zigzag-labelled-binary-tree.md1261在受污染的二叉树中查找元素problems/1261.find-elements-in-a-contaminated-binary-tree.md3.5 回溯、DFS 与 BFS14 题题号题目链接17电话号码的字母组合problems/17.Letter-Combinations-of-a-Phone-Number.md22括号生成problems/22.generate-parentheses.md39组合总和problems/39.combination-sum.md40组合总和 IIproblems/40.combination-sum-ii.md46全排列problems/46.permutations.md47全排列 IIproblems/47.permutations-ii.md78子集problems/78.subsets.md79单词搜索problems/79.word-search.md90子集 IIproblems/90.subsets-ii.md130被围绕的区域problems/130.surrounded-regions.md131分割回文串problems/131.palindrome-partitioning.md200岛屿数量problems/200.number-of-islands.md816模糊坐标problems/816.ambiguous-coordinates.md1020飞地的数量problems/1020.number-of-enclaves.md这一组建议配合 回溯专题讲义 与 DFS 专题讲义 一起刷。作者在 thinkings/backtrack.md 中给出了回溯问题的统一模板选/不选、剪枝、撤销覆盖子集、组合、排列三大经典框架200、130、1020 这类网格连通性问题则对应 小岛问题专题。3.6 动态规划21 题题号题目链接5最长回文子串problems/5.longest-palindromic-substring.md62不同路径problems/62.unique-paths.md91解码方法problems/91.decode-ways.md139单词拆分problems/139.word-break.md152乘积最大子数组problems/152.maximum-product-subarray.md221最大正方形problems/221.maximal-square.md279完全平方数problems/279.perfect-squares.md309最佳买卖股票时机含冷冻期problems/309.best-time-to-buy-and-sell-stock-with-cooldown.md322零钱兑换problems/322.coin-change.md343整数拆分problems/343.integer-break.md416分割等和子集problems/416.partition-equal-subset-sum.md464我能赢么problems/464.can-i-win.md494目标和problems/494.target-sum.md516最长回文子序列problems/516.longest-palindromic-subsequence.md518零钱兑换 IIproblems/518.coin-change-2.md718最长重复子数组problems/718.maximum-length-of-repeated-subarray.md877石子游戏problems/877.stone-game.md935骑士拨号器problems/935.knight-dialer.md1186删除一次得到子数组最大和problems/1186.maximum-subarray-sum-with-one-deletion.md1218最长定差子序列problems/1218.longest-arithmetic-subsequence-of-given-difference.md1262可被三整除的最大和problems/1262.greatest-sum-divisible-by-three.md动态规划是中等题的重灾区建议按 动态规划重置版专题 的框架系统性推进先确定状态定义 → 推导转移方程 → 初始化 → 确定遍历顺序。其中 322/518 是完全背包类416/494 是01 背包/子集类可以对照学习。3.7 二分查找与二分答案8 题题号题目链接29两数相除problems/29.divide-two-integers.md33搜索旋转排序数组problems/33.search-in-rotated-sorted-array.md50Pow(x, n)problems/50.pow-x-n.md240搜索二维矩阵 IIproblems/240.search-a-2-d-matrix-ii.md378有序矩阵中第 K 小的元素problems/378.kth-smallest-element-in-a-sorted-matrix.md875爱吃香蕉的珂珂problems/875.koko-eating-bananas.md1011在 D 天内送达包裹的能力problems/1011.capacity-to-ship-packages-within-d-days.md1015可被 K 整除的最小整数problems/1015.smallest-integer-divisible-by-k.md875 与 1011 是二分答案类题目的标准范式对结果值域二分用可行性检查函数判定强烈建议对照 二分专题讲义上 与 二分专题讲义下 一起学习。3.8 栈、滑动窗口与字符串7 题题号题目链接3无重复字符的最长子串problems/3.longest-substring-without-repeating-characters.md150逆波兰表达式求值problems/150.evaluate-reverse-polish-notation.md227基本计算器 II problems/227.basic-calculator-ii.md394字符串解码 (91)problems/394.decode-string.md686重复叠加字符串匹配problems/686.repeated-string-match.md1023驼峰式匹配problems/1023.camelcase-matching.md1381设计一个支持增量操作的栈 (91)problems/1381.design-a-stack-with-increment-operation.md3 题对应 滑动窗口专题思路 模板227、394 这类表达式/解码问题对应栈的入栈出栈时机训练配合 thinkings/basic-data-structure.md 中栈与队列章节更佳。3.9 前缀树与设计题4 题题号题目链接208实现 Trie前缀树problems/208.implement-trie-prefix-tree.md211添加与搜索单词-数据结构设计problems/211.add-and-search-word-data-structure-design.md900RLE 迭代器problems/900.rle-iterator.md911在线选举problems/911.online-election.md208/211 建议配合 前缀树专题 学习设计题整体的通用方法论可参考 thinkings/design.md。3.10 图论与并查集5 题题号题目链接547朋友圈problems/547.friend-circles.md785判断二分图problems/785.is-graph-bipartite.md886可能的二分法problems/886.possible-bipartition.md1334阈值距离内邻居最少的城市problems/1334.find-the-city-with-the-smallest-number-of-neighbors-at-a-threshold-distance.md1631最小体力消耗路径problems/1631.path-with-minimum-effort.md547 同时可用并查集与 DFS 解决对应 并查集专题 与 图论专题1631 涉及 Dijkstra 变体/二分答案属于图论进阶。3.11 位运算2 题题号题目链接201数字范围按位与problems/201.bitwise-and-of-numbers-range.md1310子数组异或查询problems/1310.xor-queries-of-a-subarray.md建议配合 位运算专题 练习1310 本质是前缀异或数组的应用。3.12 贪心、数学、排序与其他12 题题号题目链接55跳跃游戏problems/55.jump-game.md56合并区间problems/56.merge-intervals.md60第 k 个排列problems/60.permutation-sequence.md215数组中的第 K 个最大元素problems/215.kth-largest-element-in-an-array.md334递增的三元子序列problems/334.increasing-triplet-subsequence.md365水壶问题problems/365.water-and-jug-problem.md754到达终点数字problems/754.reach-a-number.md912排序数组problems/912.sort-an-array.md1227飞机座位分配概率problems/1227.airplane-seat-assignment-probability.md1558得到目标数组的最少函数调用次数problems/1558.minimum-numbers-of-function-calls-to-make-target-array.md面试题 17.09第 k 个数problems/get-kth-magic-number-lcci.md面试题 17.23最大黑方阵 problems/max-black-square-lcci.md四、四个高频考点的源码级拆解原文档强调要挖掘题目的内含信息将其抽象成简单题目。以下四道题分别代表了中等题最高频的四个算法模板仓库题解均给出了完整可运行的多语言代码。4.1 双指针61. 旋转链表91 天学算法题目problems/61.Rotate-List.md 的核心是一个数学观察 一组固定间距指针数学观察链表长度为 len 时右移 k 位等价于右移k % len位题解原文的比喻1000 米环形跑道跑 1100 米与跑 100 米到达同一地点见 problems/61.Rotate-List.md。指针策略先求长度并对 k 取模然后用快慢指针固定间距找到倒数第 k 个节点最后做三次指针重连fast.next head尾接首、slow.next null断开、返回slow.next新头。以 JS 实现为例problems/61.Rotate-List.mdvar rotateRight function (head, k) { if (!head || !head.next) return head; let count 0, now head; while (now) { now now.next; count; } k k % count; let slow (fast head); while (fast.next) { if (k-- 0) slow slow.next; fast fast.next; } fast.next head; let res slow.next; slow.next null; return res; };题解给出的复杂度为时间复杂度 O(N)节点最多遍历两遍空间复杂度 O(1)。仓库中 91/two-pointers.md 将双指针归纳为快慢指针、左右端点指针、固定间距指针三大类并给出统一伪代码模板——61 题正是固定间距指针的教科书样例。同分类的 19. 删除链表的倒数第 N 个节点 也是同一思想。4.2 排序 双指针15. 三数之和如 2.1 节所述problems/15.3sum.md 用分治把三数问题降维成两数问题固定nums[i]对剩余区间用左右端点指针找nums[left] nums[right] -nums[i]。三个容易写错的细节在题解中都有明确注释problems/15.3sum.md排序后若nums[i] 0直接break后续不可能凑成 0跳过与上一个相同的nums[i]避免重复三元组找到一个解后左右指针都要跳过连续重复元素——这样无需Set去重空间可控。复杂度O(N²) 时间O(1) 额外空间不计排序。双指针讲义 91/two-pointers.md 中有序数组 左右端点指针一节正是为这类 N 数之和问题准备的。4.3 二分答案875. 爱吃香蕉的珂珂problems/875.koko-eating-bananas.md 是对结果二分的典型直觉解法是从最大堆开始逐个减速度去试复杂度高达 O(N × M)M 为堆中最大香蕉数本题可达 10⁹见题解思路部分。而二分答案只需在[1, max(piles)]上二分速度 K用可行性函数possible(mid)判断以 mid 的速度能否在 H 小时内吃完# 摘自 problems/875.koko-eating-bananas.md class Solution: def solve(self, piles, k): def possible(mid): t 0 for pile in piles: t (pile mid - 1) // mid # 向上取整 return t k l, r 1, max(piles) while l r: mid (l r) // 2 if possible(mid): r mid - 1 else: l mid 1 return l题解在 problems/875.koko-eating-bananas.md 的前置知识中直接指向 91/binary-search.md 讲义同一模板还出现在 1011. 在 D 天内送达包裹的能力对船的运载能力二分。二分答案类题的关键是单调性速度越大越容易吃完可行性检查函数。4.4 动态规划322. 零钱兑换problems/322.coin-change.md 展示了贪心直觉为何会失效先取大面值硬币[5,2,1] 凑 11看似可行但作者在题解中演示了这种贪心过程并指出需要动态规划兜底见 problems/322.coin-change.md 的推导。正确做法是完全背包式 DP状态dp[i]表示凑出金额i所需的最少硬币数转移dp[i] min(dp[i], dp[i - coin] 1)对每个面额 coin 做一维滚动更新初始化dp[0] 0其余为无穷大若dp[amount]仍为无穷大则返回 -1。题解的前置知识problems/322.coin-change.md标注了贪心算法与 动态规划专题 两个学习入口。它的姊妹题 518. 零钱兑换 II 只把最少个数换成方案数但转移时改为累加一题组对刷效果最佳416. 分割等和子集、494. 目标和 则是同一背包框架下的能否/计数变体。五、与仓库专题讲义的联动路线中等题不是孤立刷的。仓库 README 维护了一套与上述分类一一对应的专题讲义thinkings/README.md建议按下面的映射关系配套推进本文分类配套专题讲义数组与双指针双指针讲义、滑动窗口专题链表链表专题二叉树树专题、二叉树遍历专题、平衡二叉树专题回溯/DFS/BFS回溯专题、DFS 专题、小岛问题专题动态规划动态规划重置版二分查找二分讲义上、二分讲义下栈/单调栈单调栈专题、数据结构总览前缀树/设计题前缀树专题、设计专题图论/并查集并查集专题、图论专题位运算位运算专题前缀和前缀和专题一次搞定前缀和排序堆专题上、堆专题下此外仓库 assets/anki/leetcode.apkg 提供了 Anki 记忆卡片在 Anki 中文件 → 导入 → 选择打包的 anki 集合即可使用可按题目 ↔ 关键点 ↔ 思路 ↔ 代码的映射进行间隔复习与中等题合集中的题目配合食用。六、结语先做熟中等题回到 collections/medium.md 的核心理念中等题是力扣比例最大的部分先把中等难度题目做熟再谈难题。中等题的两大关卡——抽象成简单题与代码写得对——分别对应算法思维训练与编码细节训练缺一不可。本文给出的 12 类共 125 道题目索引覆盖了全部主流考点每道题在仓库 problems/ 目录下都有包含多语言代码、复杂度分析、关键点解析的完整题解建议按照分类推进 专题讲义 亲手码一遍的方式循环使用这份清单把每一类的通用模板内化为自己的解题框架。【免费下载链接】leetcodeLeetCode Solutions: A Record of My Problem Solving Journey.( leetcode题解记录自己的leetcode解题之路。)项目地址: https://gitcode.com/gh_mirrors/le/leetcode创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考