122:组合总和II

LeetCode 40 https://leetcode.cn/problems/combination-sum-ii/description/ 难度:中等 高频面试题汇总:https://www.yuweihung.com/posts/2025/lc-hot/ 为了避免得到重复的答案,首先对数组排序。如果选,递归到 i + 1,如果不选,跳过所有等于当前数的数,递归到 i + k。也就是对于相同的元素,只能按照顺序选,不能跳过一个选后面的。 时间复杂度:\(O(n\*2^2)\) 空间复杂度:O(n) ...

七月 15, 2025 · Cassius

109:单词搜索

LeetCode 79 https://leetcode.cn/problems/word-search/description/ 难度:中等 高频面试题汇总:https://www.yuweihung.com/posts/2025/lc-hot/ 网格图回溯。为了知道当前匹配到了第几个字母,需要三个参数 dfs(i, j, k)。 定义 dfs(i,j,k) 表示当前在 board[i][j] 这个格子,要匹配 word[k],返回在这个状态下最终能否匹配成功(搜索成功)。 如果 board[i][j] != word[k],匹配失败,返回 false。 否则,如果 k == len(word) − 1,匹配成功,返回 true。 否则,枚举 (i, j) 周围的四个相邻格子 (x, y),如果 (x, y) 没有出界,则递归 dfs(x, y, k + 1),如果其返回 true,则 dfs(i, j, k) 也返回 true。 如果递归周围的四个相邻格子都没有返回 true,则最后返回 false,表示没有搜到。 递归过程中,为了避免重复访问同一个格子,可以直接修改 board[i][j],将其置为空(或者 0),返回 false 前再恢复成原来的值(恢复现场)。注意返回 true 的时候就不用恢复现场了,因为已经成功搜到 word 了。 时间复杂度:\(O(mn3^k)\),其中 m 和 n 分别为 grid 的行数和列数,k 是 word 的长度。除了递归入口,其余递归至多有 3 个分支(因为至少有一个方向是之前走过的),所以每次递归(回溯)的时间复杂度为 \(O(3^k)\),一共回溯 O(mn) 次,所以时间复杂度为 \(O(mn3^k)\)。 空间复杂度:O(∣Σ∣+k)。其中 ∣Σ∣=52 是字符集合的大小。递归需要 O(k) 的栈空间。部分语言用的数组代替哈希表,可以视作 ∣Σ∣=128。 ...

七月 13, 2025 · Cassius

111:全排列 II

LeetCode 47 https://leetcode.cn/problems/permutations-ii/description/ 难度:中等 高频面试题汇总:https://www.yuweihung.com/posts/2025/lc-hot/ 本题是有重复元素的全排列。如何避免得到重复的结果呢?可以把相同的元素排一个顺序,只能从左往右按顺序排。 为方便判断,先把 nums 排序(从小到大或者从大到小都可以)。 如果 nums[i] != nums[i−1],那么 nums[i] 就是所有等于 nums[i] 的数中的第一个数。我们规定:这种情况可以随意填。 如果 nums[i] == nums[i−1],继续讨论: 如果 nums[i−1] 没有填入排列,为了避免生成重复的排列,绝对不能填 nums[i],直接 continue。这会导致后续所有等于 nums[i] 的数全部 continue,因为对于后面的 nums[i] 来说,nums[i] 和前面的数 nums[i−1] 相等,并且 nums[i−1] 没有填入排列。 如果 nums[i−1] 已经填入排列,那么 nums[i] 是剩余元素(子问题)中的第一个等于 nums[i] 的数,可以随意填。 时间复杂度:O(n⋅n!),其中 n 为 nums 的长度。分析方法同 46 题的题解。 空间复杂度:O(n)。返回值的空间不计入。 ...

七月 13, 2025 · Cassius

083:路径总和 II

LeetCode 113 https://leetcode.cn/problems/path-sum-ii/description/ 难度:中等 高频面试题汇总:https://www.yuweihung.com/posts/2025/lc-hot/ 子集型回溯。 时间复杂度:\(O(n^2)\),其中 n 是二叉树的节点个数。对于「一条链 + 完全二叉树」这样的「扫帚型」二叉树,我们会在 O(n) 个叶子节点处,都去复制长为 O(n) 的 path,所以总的时间复杂度为 \(O(n^2)\)。 空间复杂度:O(n)。返回值不计入。 ...

七月 5, 2025 · Cassius

066:组合总和

LeetCode 39 https://leetcode.cn/problems/combination-sum/description/ 难度:中等 高频面试题汇总:https://www.yuweihung.com/posts/2025/lc-hot/ 子集型回溯,选或不选。 类似完全背包,选的话递归到 dfs(i, left - candidates[i]),不选递归到 dfs(i + 1, left)。 时间复杂度:O(S),其中 S 为所有可行解的长度之和。从分析给出的搜索树我们可以看出时间复杂度取决于搜索树所有叶子节点的深度之和,即所有可行解的长度之和。在这题中,我们很难给出一个比较紧的上界,我们知道 \(O(n2^n)\) 是一个比较松的上界,即在这份代码中,n 个位置每次考虑选或者不选,如果符合条件,就加入答案的时间代价。但是实际运行的时候,因为不可能所有的解都满足条件,递归的时候我们还会用 target−candidates[idx]≥0 进行剪枝,所以实际运行情况是远远小于这个上界的。 空间复杂度:O(target)。除答案数组外,空间复杂度取决于递归的栈深度,在最差情况下需要递归 O(target) 层。 ...

七月 3, 2025 · Cassius

060:子集

LeetCode 78 https://leetcode.cn/problems/subsets/description/ 难度:中等 高频面试题汇总:https://www.yuweihung.com/posts/2025/lc-hot/ 子集型回溯,选或不选。 时间复杂度:\(O(n2^n)\),其中 n 为 nums 的长度。每次都是选或不选,递归次数为一个满二叉树的节点个数,那么一共会递归 \(O(2^n)\) 次(等比数列和),再算上加入答案时复制 path 需要 O(n) 的时间,所以时间复杂度为 \(O(n2^n)\)。 空间复杂度:O(n)。返回值的空间不计。 ...

七月 3, 2025 · Cassius

044:括号生成

LeetCode 22 https://leetcode.cn/problems/generate-parentheses/description/ 难度:中等 高频面试题汇总:https://www.yuweihung.com/posts/2025/lc-hot/ 选或不选。选就是左括号,不选就是右括号。左右括号的数量需要有约束,open 是左括号的数量。open < n 限制左括号至多填 n 个,i - open < open 限制右括号至多填 open 个。 时间复杂度:分析回溯问题的时间复杂度,有一个通用公式:路径长度 × 搜索树的叶子数。对于本题,它等于 O(n⋅C(2n,n))。但由于左右括号的约束,实际上没有这么多叶子,根据 Catalan 数,实际的时间复杂度为 O(C(2n,n))。 空间复杂度:O(n)。返回值的空间不计入。 ...

七月 1, 2025 · Cassius

033:复原IP地址

LeetCode 93 https://leetcode.cn/problems/restore-ip-addresses/description/ 难度:中等 高频面试题汇总:https://www.yuweihung.com/posts/2025/lc-hot/ 子集型回溯题目,本题使用“枚举选哪个”方法。 dfs(i, start) i 表示第几段,start 表示这一段从第几个数字开始。当选够 4 段且所有数字都被使用时添加答案。 如果 s[start] 为 0,这一段只能是 0,dfs(i + 1, start + 1)。 如果不是 0,这一段的数据范围需要在 [1, 255]之间,如果超过 255 就 break。 时间复杂度:\(O(3^N \times m)\),m 为 s 的长度。 空间复杂度:O(N) ...

六月 30, 2025 · Cassius

015:全排列

LeetCode 46 https://leetcode.cn/problems/permutations/description/ 难度:中等 高频面试题汇总:https://www.yuweihung.com/posts/2025/lc-hot/ 这是一道回溯法的题目,本题适用于“枚举选哪个”方法。 时间复杂度:O(n⋅n!),其中 n 为 nums 的长度。搜索树中的节点个数低于 3⋅n!。实际上,精确值为 ⌊e⋅n!⌋,其中 e=2.718⋯ 为自然常数。有 O(n!) 个叶节点,每个叶节点花费 O(n) 的时间复制 path 数组,因此时间复杂度为 O(n⋅n!)。 空间复杂度:O(n)。返回值的空间不计入。 ...

六月 29, 2025 · Cassius