排列组合子集问题一网打尽
raw/articles/2026/05/排列组合子集问题一网打尽
⚠️ 内容不完整:原文使用 JavaScript 动态加载(Next.js),仅获取到 62 行开头部分(标题、题目列表、前置知识、问题形式定义、两种回溯树示意图),缺失核心内容(9 种形式的详细解法、代码示例、回溯树详细讲解等)。
核心思想
排列、组合、子集问题的本质是穷举所有解,解呈现树形结构,使用回溯算法框架,稍改代码即可把这些问题一网打尽。
组合问题和子集问题其实是等价的,排列、组合、子集问题都可以用两种回溯树解决:
- 子集树(子集/组合问题)
- 排列树(排列问题)
三种变化形式无非是在这两棵树上剪掉或者增加一些树枝。
问题形式分类
无论是排列、组合还是子集问题,都可以按以下三种形式变化:
形式一:元素无重不可复选
nums 中的元素都是唯一的,每个元素最多只能被使用一次。
示例:输入 nums = [2,3,6,7],和为 7 的组合只有 [7]。
形式二:元素可重不可复选
nums 中的元素可以存在重复,每个元素最多只能被使用一次。
示例:输入 nums = [2,5,2,1,2],和为 7 的组合有两种 [2,2,2,1] 和 [5,2]。
形式三:元素无重可复选
nums 中的元素都是唯一的,每个元素可以被使用若干次。
示例:输入 nums = [2,3,6,7],和为 7 的组合有两种 [2,2,3] 和 [7]。
注意:元素可重可复选的情况等同于形式三(去重即可),无需单独考虑。
变化总数:排列、组合、子集 × 三种形式 = 9 种变化。
回溯树示意图

![[images/permutation-2.jpeg]]
相关题目
| LeetCode | 力扣 | 问题类型 |
|---|---|---|
| 78. Subsets | 78. 子集 | 子集(形式一) |
| 77. Combinations | 77. 组合 | 组合(形式一) |
| 46. Permutations | 46. 全排列 | 排列(形式一) |
| 90. Subsets II | 90. 子集 II | 子集(形式二) |
| 40. Combination Sum II | 40. 组合总和 II | 组合(形式二) |
| 47. Permutations II | 47. 全排列 II | 排列(形式二) |
| 39. Combination Sum | 39. 组合总和 | 组合(形式三) |
| 216. Combination Sum III | 216. 组合总和 III | 组合(形式三) |
| LCR 082. 组合总和 II | LCR 082. 组合总和 II | 组合(形式二) |
| LCR 084. 全排列 II | LCR 084. 全排列 II | 排列(形式二) |
相关概念
待补充内容
由于原文动态加载,缺失以下核心内容:
- 9 种形式(排列/组合/子集 × 三种形式)的详细解法
- 完整代码示例(Java/Python)
- 回溯树的详细讲解(如何剪枝、如何添加/删除树枝)
- 球盒模型:回溯算法穷举的两种视角
- 去重技巧(处理形式二:元素可重不可复选)
- 复选技巧(处理形式三:元素无重可复选)