排列组合子集问题一网打尽

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-1.jpeg

![[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)
  • 回溯树的详细讲解(如何剪枝、如何添加/删除树枝)
  • 球盒模型:回溯算法穷举的两种视角
  • 去重技巧(处理形式二:元素可重不可复选)
  • 复选技巧(处理形式三:元素无重可复选)

Interactive Graph