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]