LeetCode 90:子集 II,从重复分支推出层内去重

题目要求 输入输出 输入:nums,长度 1 <= nums.length <= 10 元素范围:-10 <= nums[i] <= 10 nums 可能有重复元素 输出:返回所有不重复子集 顺序:结果顺序不限,但同一个值序列的子集只能出现一次 示例 输入:nums = [1,2,2] 输出:[[],[1],[1,2],[1,2,2],[2],[2,2]] 这篇只用 Python,从一个能跑但浪费的版本,一步一步过渡到排序 + 层内去重。 从 [1,2,2] 的重复分支开始 最小能暴露问题的例子是: nums = [1,2,2] 如果直接照搬 78. 子集 的模板,搜索树里会出现两条不同分支: 选择下标 1 的 2 -> [2] 选择下标 2 的 2 -> [2] 这两个分支路径不同,但值序列相同,最终答案重复。 所以这题真正新增的问题不是“会不会回溯”,而是: 怎样跳过重复分支,同时保留 [2,2] 这种合法答案? Step 1:先复用 78 的状态,看看哪里会坏 当前部分答案仍然需要 path;当前层仍然需要 start 控制只能往右选。 先写出 78 的核心版本: def dfs(start: int) -> None: res.append(path.copy()) for i in range(start, len(nums)): path.append(nums[i]) dfs(i + 1) path.pop() 这个版本在 nums 全部互不相同时是正确的。 ...

2026年5月3日 · 3 分钟 · map[name:Jeanphilo]

LeetCode 40:组合总和 II(回溯 / 同层去重 / 只能用一次)ACERS 解析

副标题 / 摘要 如果说 39. 组合总和 教你“当前值还能继续用”,那 40. 组合总和 II 教你的就是下一层升级:数组里会出现重复值、每个位置只能用一次、去重必须发生在正确的树层上。 预计阅读时长:14~16 分钟 标签:回溯、去重、剪枝、组合搜索 SEO 关键词:Combination Sum II, 组合总和 II, 回溯, 同层去重, 剪枝, LeetCode 40 元描述:从题目本身一步一步推出 LeetCode 40 的稳定解法,真正理解排序、i + 1 递归和“同层去重”规则。 A — Algorithm(题目与算法) 题目还原 给定一个候选数组 candidates 和一个目标值 target, 找出所有和为 target 的不同组合,并以列表形式返回。 candidates 中的每个数字在每个组合里 最多只能使用一次。 最终答案中不能包含重复组合。 输入输出 名称 类型 描述 candidates int[] 候选数组,允许出现重复值 target int 目标和 返回 int[][] 所有和为 target 的不同组合 示例 1 输入:candidates = [10,1,2,7,6,1,5], target = 8 输出: [ [1,1,6], [1,2,5], [1,7], [2,6] ] 示例 2 输入:candidates = [2,5,2,1,2], target = 5 输出: [ [1,2,2], [5] ] 约束 1 <= candidates.length <= 100 1 <= candidates[i] <= 50 1 <= target <= 30 目标读者 已经做完 39. 组合总和,想继续搞清“不能重复选”之后模板怎么变的学习者 会写回溯框架,但一碰到输入里有重复值就容易写乱去重逻辑的读者 想真正掌握“同层去重”而不是硬背一句 if i > start and ... 的开发者 背景 / 动机 这道题是 39 的自然下一题,因为它同时改了两条规则: ...

2026年4月17日 · 8 分钟 · map[name:Jeanphilo]