这里是 Hot100 系列的合集页。每题统一按 ACERS 模板写作,强调“题解模板化 + 工程场景迁移 + 多语言实现”。
推荐阅读
- 先从数组 / 哈希 / 前缀和等高频主题开始
- 每题掌握一个可复用的“方法模型”
- 做完题后再回到工程场景,强化迁移能力
这里是 Hot100 系列的合集页。每题统一按 ACERS 模板写作,强调“题解模板化 + 工程场景迁移 + 多语言实现”。
这里收录 Hot100 中与贪心相关的题目,重点理解局部选择为什么足以推出全局答案,以及扫描过程中应该冻结哪些状态。 推荐阅读顺序 LeetCode 121:买卖股票的最佳时机,从历史最低价推出一次交易贪心 LeetCode 55:跳跃游戏,用最远覆盖范围判断能否到达终点 LeetCode 45:跳跃游戏 II,从可达边界升级到最少跳数 LeetCode 435:无重叠区间,从删除最少转成保留最多 LeetCode 452:用最少数量的箭引爆气球,从共同交集推出区间贪心
这里收录 Hot100 中与并查集相关的模板和题目,重点理解集合代表、路径压缩、合并条件、连通性判断和连通分量计数。 推荐阅读顺序 并查集模板:find / union / count 从零推导 LeetCode 547:省份数量,把邻接矩阵看成图的连通分量
这里收录 Hot100 中与 Trie 相关的题目和模板,重点理解节点字段、children 路径、结束标记和循环 invariant。
这里收录 Hot100 中与回溯相关的题目,统一按 ACERS 结构整理,强调“从题目目标一步一步推到代码结果”的 guided-build 学习方式,以及“模板稳定 + 剪枝明确 + 工程迁移”。
这里收录 Hot100 中与二叉树相关的题目,统一按 ACERS 结构整理。
这里收录 Hot100 中与链表相关的题目,统一按 ACERS 结构整理。
副标题 / 摘要 “矩阵置零”是典型的二维标记传播问题:某个位置为 0,会影响整行整列。本文用 ACERS 结构讲清楚为什么不能直接改、如何用首行首列做标记实现原地 O(1) 额外空间,并给出多语言可运行代码。 预计阅读时长:12~15 分钟 标签:矩阵、原地算法、标记位 SEO 关键词:矩阵置零, 原地 O(1) 空间, 首行首列标记, LeetCode 73 元描述:用首行首列作标记位,原地将含 0 的行与列全部置零;包含推导、复杂度对比、工程迁移与多语言实现。 目标读者 刷 LeetCode,想把“二维数组原地技巧”沉淀成稳定模板的同学 需要在工程里做二维网格/表格/矩阵数据清洗与传播标记的开发者 对空间优化敏感(嵌入式、性能场景、内存受限)的工程师 背景 / 动机 二维数据在工程里到处都是:表格、图像、传感器网格、关联矩阵…… “某个单元格触发规则 -> 影响整行整列”这种联动,本质就是 行列传播(row/col propagation)。 这题额外要求“原地”,逼你掌握一个非常通用的技巧:用数据结构本身的某些位置当作标记位,避免额外内存。 核心概念 传播标记:发现 0 后,不是立刻改整行整列,而是先记录“哪些行/列要被清零” 原地(in-place):只允许 O(1) 额外空间(不算输入矩阵本身) 标记位复用:把 matrix[0][j] 当作“第 j 列要清零”的标记,把 matrix[i][0] 当作“第 i 行要清零”的标记 首行/首列特判:首行/首列既是数据又是标记位,因此需要单独用两个布尔量记录它们是否本来就该清零 A — Algorithm(题目与算法) 题目还原 给定一个 m x n 矩阵 matrix:如果某个元素为 0,则将该元素所在的 整行 与 整列 的所有元素都设置为 0。 要求 原地修改 matrix(通常不需要返回值)。 ...
副标题 / 摘要 缺失的第一个正数是经典的“原地哈希/索引定位”题:把值放回它应该在的位置,再线性扫描即可找到答案。本文按 ACERS 拆解思路、工程应用与多语言实现。 预计阅读时长:12~15 分钟 标签:Hot100、数组、原地哈希 SEO 关键词:First Missing Positive, 缺失的第一个正数, 原地哈希, 索引映射, O(n) 元描述:O(n) 时间、O(1) 额外空间的原地索引定位解法,含工程场景与多语言代码。 目标读者 正在刷 Hot100 的学习者 想掌握“原地索引定位”模板的中级开发者 需要在原数组内做高效重排与定位的工程师 背景 / 动机 “找最小缺失正数”本质是一个定位问题: 如果能把值 x 放在索引 x-1 上,那么答案就是第一个不匹配的位置。 题目还要求 O(n) 时间和 O(1) 额外空间,逼迫我们放弃排序与哈希表, 转而使用原地置换的技巧。 核心概念 概念 含义 作用 原地哈希 用数组下标充当哈希桶 O(1) 额外空间 索引定位 值 x 应放到 x-1 构造可扫描的结构 置换交换 不断交换直到就位 线性时间完成 A — Algorithm(题目与算法) 题目还原 给你一个未排序的整数数组 nums,找出其中没有出现的最小正整数。 请实现 O(n) 时间复杂度并且只使用 常数级别额外空间的解决方案。 输入输出 名称 类型 描述 nums int[] 未排序整数数组 返回 int 最小缺失的正整数 示例 1(官方) 输入: nums = [1,2,0] 输出: 3 示例 2(官方) 输入: nums = [3,4,-1,1] 输出: 2 思路概览 对每个位置 i,把 nums[i] 放到它应该去的位置 nums[i]-1。 完成“就位”后,从左到右找到第一个 nums[i] != i+1 的位置。 该位置对应的正整数 i+1 即为答案;若全部匹配则答案为 n+1。 C — Concepts(核心思想) 关键模型 值 x 应该放在索引 x-1 方法归类 原地哈希(Index-as-Hash) 数组置换 / 位置归位 线性扫描验证 不变量 当置换结束时: 如果 nums[i] == i+1,说明正整数 i+1 存在; 第一个不匹配的 i,就是最小缺失正整数的位置。 ...
副标题 / 摘要 除自身以外数组的乘积是典型的前后缀乘积题:不使用除法,在 O(n) 时间内完成。本文按 ACERS 结构拆解题意与算法,并给出工程迁移场景与多语言实现。 预计阅读时长:10~12 分钟 标签:Hot100、数组、前缀乘积 SEO 关键词:Product of Array Except Self, 除自身以外数组的乘积, 前缀乘积, 后缀乘积, O(n) 元描述:用前后缀乘积在 O(n) 时间内解决除自身以外数组的乘积问题,含工程场景与多语言代码。 目标读者 正在刷 Hot100 的学习者 想掌握“前后缀乘积”模型的中级开发者 需要做序列因子组合与乘积聚合的工程师 背景 / 动机 很多业务需要“排除自身的整体乘积”: 例如组合指标、冗余度评估、批量权重计算等。 若直接对每个位置做一次全数组相乘,复杂度会退化为 O(n^2); 而题目还明确禁止使用除法,因此必须依赖前后缀乘积的线性解法。 核心概念 前缀乘积:prefix[i] = nums[0] * ... * nums[i-1] 后缀乘积:suffix[i] = nums[i+1] * ... * nums[n-1] 无除法:只允许乘法与遍历 空间优化:用结果数组承载前缀,再用后缀补乘 A — Algorithm(题目与算法) 题目还原 给定一个整数数组 nums,返回数组 answer, 其中 answer[i] 等于 nums 中除了 nums[i] 之外其余各元素的乘积。 题目保证任意元素的前缀/后缀乘积都在 32 位整数范围内。 要求:不使用除法,并在 O(n) 时间内完成。 ...
副标题 / 摘要 轮转数组是典型的数组变换题:把数组整体向右移动 k 位。本文用 ACERS 拆解“三次反转”的核心思路,并给出工程场景迁移与多语言可运行实现。 预计阅读时长:10~12 分钟 标签:Hot100、数组、旋转 SEO 关键词:Rotate Array, 轮转数组, 数组旋转, 反转, O(n) 元描述:三次反转法解决轮转数组,含复杂度对比、工程场景与多语言代码。 目标读者 正在刷 Hot100 的学习者 想掌握“数组原地变换”模板的中级开发者 需要处理时间序列对齐、轮值偏移的工程师 背景 / 动机 轮转数组在工程中非常常见: 轮值排班、时间序列对齐、环形缓冲区、前端轮播等都可以抽象为“整体右移 k 位”。 如果用逐步移动会变成 O(nk),在数据量稍大时就不可用,因此需要更高效的原地方案。 核心概念 轮转(rotate):把数组向右移动 k 位,后 k 个元素移到最前 k 取模:k %= n,避免 k 超过数组长度 反转(reverse):用双指针交换来原地反转区间 原地(in-place):在原数组上操作,额外空间 O(1) A — Algorithm(题目与算法) 题目还原 给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。 输入输出 名称 类型 描述 nums int[] 整数数组 k int 向右轮转步数 返回 int[] 轮转后的数组 示例 1(官方) 输入: nums = [1,2,3,4,5,6,7], k = 3 输出: [5,6,7,1,2,3,4] 示例 2(官方) 输入: nums = [-1,-100,3,99], k = 2 输出: [3,99,-1,-100] C — Concepts(核心思想) 关键思路:三次反转 反转整个数组 反转前 k 个 反转后 n-k 个 反转后的位置关系刚好等价于右移 k 位。 ...
副标题 / 摘要 合并区间是最典型的“排序 + 线性扫描”问题:先按起点排序,再顺序合并重叠区间。本文按 ACERS 结构拆解题意、核心概念、工程迁移与多语言实现,帮助你形成可复用的区间处理模型。 预计阅读时长:12~15 分钟 标签:Hot100、区间、排序、扫描线、合并区间 SEO 关键词:Merge Intervals, 合并区间, 区间合并, 排序, 扫描线 元描述:合并区间的排序扫描解法与工程应用解析,含复杂度对比与多语言实现。 目标读者 想掌握“区间合并”基础模型的初学者 需要把算法思路迁移到工程场景的中级开发者 正在准备算法面试、希望快速建立区间类题型的求职者 背景 / 动机 区间问题在日程排班、监控窗口、日志聚合、资源分配中非常常见。 如果没有一个统一的合并策略,很容易产生重复统计、冲突判断错误或资源浪费。 因此,“把重叠区间合成最少的不重叠集合”是工程与算法都高频出现的基础能力。 A — Algorithm(题目与算法) 题目还原 给定一个区间数组 intervals,其中 intervals[i] = [starti, endi] 表示第 i 个区间。 请合并所有重叠的区间,并返回一个不重叠的区间数组,且能完整覆盖输入中的所有区间。 输入输出 名称 类型 描述 intervals int[][] 区间数组,元素为 [start, end] 返回 int[][] 合并后的不重叠区间数组 基础示例(官方) 输入 输出 [[1,3],[2,6],[8,10],[15,18]] [[1,6],[8,10],[15,18]] [[1,4],[4,5]] [[1,5]] 合并示意(示例 1) 排序后: [1,3] [2,6] [8,10] [15,18] 合并: [1,3] + [2,6] -> [1,6] 结果: [1,6] [8,10] [15,18] 思路概览 按区间起点升序排序(起点相同则按终点升序)。 线性扫描,维护当前合并区间 [cur_start, cur_end]。 如果下一个区间 next_start <= cur_end,则合并为 cur_end = max(cur_end, next_end)。 否则将当前区间放入结果,并以新起点开始下一段合并。 C — Concepts(核心思想) 核心概念 概念 含义 作用 重叠 next_start <= cur_end 判断是否需要合并 合并 cur_end = max(cur_end, next_end) 扩展当前区间 排序 按起点排序 让重叠区间相邻 方法类型 排序 + 线性扫描 + 贪心合并。 ...
题目要求 给定 n 个非负整数 height。每个整数表示一根宽度为 1 的柱子高度,所有柱子从左到右相邻排列。 下雨后,有些较矮的柱子上方会被两侧较高的柱子围住水。返回整张高度图最终能接住的雨水总量。 LeetCode 要求实现: class Solution: def trap(self, height: List[int]) -> int: ... 示例 1 输入:height = [0,1,0,2,1,0,1,3,2,1,2,1] 输出:6 示例 2 输入:height = [4,2,0,3,2,5] 输出:9 约束 n == len(height) 1 <= n <= 2 * 10^4 0 <= height[i] <= 10^5 Step 1:先回答一个位置能接多少水 先不计算整张高度图,只看一个位置: height = [3,0,2] ^ i = 1 下标 1 的柱子高度是 0。它左边有高度为 3 的柱子,右边有高度为 2 的柱子。 如果只看左边,似乎可以把水加到高度 3。但右边的墙只有高度 2,超过 2 的水会从右边流走。因此这个位置的水面最高只能到: min(左侧最高柱子, 右侧最高柱子) = min(3, 2) = 2 这个位置上方的水量是: ...
副标题 / 摘要 最小覆盖子串是“可变滑动窗口 + 计数哈希表”的经典题。本文按 ACERS 模板解释如何判断窗口有效、如何收缩得到最短答案,并给出工程场景与多语言实现。 预计阅读时长:12~15 分钟 标签:滑动窗口、哈希表、字符串 SEO 关键词:Minimum Window Substring, 最小覆盖子串, 滑动窗口, 哈希表 元描述:最小覆盖子串的 O(n) 滑动窗口解法与工程应用,含多语言实现。 目标读者 正在刷 LeetCode 的中级开发者 需要掌握“可变窗口 + 覆盖约束”的算法模板 做文本分析、日志聚合或流式过滤的工程师 背景 / 动机 “在一段序列中找到最短区间覆盖目标集合”在工程中非常常见: 日志告警需要覆盖多种错误码,搜索摘要需要覆盖关键字, 运营分析需要覆盖多个行为标签。 本题提供了一个可复用的窗口收缩模板。 核心概念 可变滑动窗口:右指针扩张直到满足条件,左指针收缩缩短答案 计数哈希表:支持重复字符,必须按次数覆盖 满足条件的计数:判断当前窗口是否“覆盖了全部需要” A — Algorithm(题目与算法) 题目重述 给定字符串 s 和 t,返回 s 中最短的子串,使其包含 t 中的每一个字符(包括重复字符)。 若不存在这样的子串,返回空字符串 ""。 测试用例保证答案唯一。 输入输出 名称 类型 描述 s string 源字符串 t string 目标字符串(需要覆盖的字符与次数) 返回 string 最短覆盖子串或空串 示例 1 s = "ADOBECODEBANC", t = "ABC" 输出 = "BANC" 示例 2 s = "a", t = "a" 输出 = "a" 示例 3 s = "a", t = "aa" 输出 = "" C — Concepts(核心思想) 方法类型 可变滑动窗口 + 频次覆盖判断。 ...
题目要求 给你一个整数数组 nums 和一个整数 k。一个恰好包含 k 个连续元素的窗口从 nums 最左端开始,每次向右移动一位。请按窗口从左到右的顺序,返回每个窗口中 的最大值。 窗口中的元素必须连续,其原有顺序和位置不会改变,相邻窗口可以重叠。数组中的值 可以重复,也可以是负数。 LeetCode 接口约定 LeetCode 会调用 maxSlidingWindow(nums, k)。该方法接收整数数组和一个合法的窗口 大小,返回一个整数数组,其中依次包含每个完整窗口的最大值。输入保证满足下面的 约束。 示例 示例 1: 输入:nums = [1,3,-1,-3,5,3,6,7], k = 3 输出:[3,3,5,5,6,7] 示例 2: 输入:nums = [1], k = 1 输出:[1] 约束 1 <= nums.length <= 10^5 -10^4 <= nums[i] <= 10^4 1 <= k <= nums.length 第 1 步:窗口什么时候才完整? 在示例 1 中,当窗口右端到达索引 2 时,窗口由哪些索引组成?右端继续到达索引 3 时,又会发生什么变化? 目前我们只知道一个大小为 k 的窗口会向右移动。要枚举所有输出时,这个描述还 不够:它既没有准确说明窗口的左端,也没有说明第一个完整窗口会在哪个位置出现。 使用从零开始的索引,把当前结束位置记为 right。如果窗口从 left 开始,并且 恰好包含 k 个元素,那么: ...
副标题 / 摘要 这是 Hot100 专栏第 1 篇:和为 K 的子数组。本文用“前缀和 + 频次哈希表”把 O(n^2) 降到 O(n),并按 ACERS 模板给出工程场景与多语言实现。 预计阅读时长:12~15 分钟 标签:Hot100、前缀和、哈希表 SEO 关键词:Subarray Sum Equals K, 和为K的子数组, 前缀和, 哈希表, O(n) 元描述:和为 K 的子数组计数问题的前缀和解法,含工程迁移、复杂度对比与多语言代码。 目标读者 正在刷 Hot100,希望建立稳定算法模板的初学者 需要把计数类算法迁移到业务数据统计的中级工程师 准备面试,想掌握“前缀和 + 哈希表”核心套路的人 背景 / 动机 “统计和为 K 的子数组数量”是最经典的计数类问题之一。 它广泛出现在日志分析、风控阈值命中、交易序列统计等场景。 朴素的两层遍历虽然直观,但一旦数据规模增大就会明显卡顿,因此需要可扩展的 O(n) 解法。 核心概念(必须理解) 子数组:数组中连续、非空的片段 前缀和:prefix[i] = nums[0..i] 的和 差分关系:若 prefix[r] - prefix[l-1] = k,则 nums[l..r] 的和为 k 频次哈希表:统计某个前缀和出现的次数,以 O(1) 均摊时间查询 A — Algorithm(题目与算法) 题目还原 给你一个整数数组 nums 和一个整数 k,请统计并返回 和为 k 的子数组 的个数。 子数组是数组中元素的连续非空序列。 ...
副标题 / 摘要 Two Sum(两数之和)是最经典的数组哈希题:用“补数 + 哈希表”把 O(n^2) 降到 O(n)。本文按 ACERS 结构拆解题意、原理与工程迁移,并给出多语言可运行实现。 预计阅读时长:10~12 分钟 标签:Hot100、哈希表、数组、补数、面试高频 SEO 关键词:Two Sum, 两数之和, hash map, 补数, O(n), LeetCode 1, Hot100 元描述:两数之和的哈希表解法与工程应用解析,含复杂度对比与多语言代码。 目标读者 刚开始刷题,希望建立“补数 + 哈希表”基本模型的初学者 需要把算法思路迁移到工程问题的中级开发者 准备面试、想快速掌握高频题的求职者 背景 / 动机 “在一堆数字里找出两数之和”等价于一个快速配对问题,常见于对账、预算、风控、推荐等场景。 朴素暴力法虽然简单,但在数据量上来后会直接超时;哈希表一遍扫描能把复杂度从 O(n^2) 降到 O(n),是最工程可行的做法之一。 A — Algorithm(题目与算法) 题目还原 给定一个整数数组 nums 和一个整数目标值 target,请在该数组中找出和为目标值的 两个 整数,并返回它们的数组下标。 每种输入只会对应一个答案,并且你不能使用两次相同的元素。答案可以按任意顺序返回。 输入输出 名称 类型 描述 nums int[] 整数数组 target int 目标和 返回 int[] 满足 nums[i] + nums[j] == target 的下标 基础示例 nums target 输出 [2, 7, 11, 15] 9 [0, 1] [3, 2, 4] 6 [1, 2] 补数图示(示例 1) ...