子集枚举

进阶

子集问题把回溯树压缩成最清晰的二叉选择结构。

子集枚举

每个元素「选或不选」,观察二叉决策树的展开过程。

AlgoAnim · 子集枚举

待机

速度
待机
// 源代码
1vector<int> subset;
2
3void dfs(int idx, const vector<int>& nums) {
4    if (idx == (int)nums.size()) {
5        return;
6    }
7    dfs(idx + 1, nums);
8    subset.push_back(nums[idx]);
9    dfs(idx + 1, nums);
10    subset.pop_back();
11}

复杂度分析

时间 O(n * 2^n)
空间 O(n)
最优 O(1)
最坏 O(n * 2^n)

算法讲解

对子集问题来说,每个元素都只有两个决策:加入当前集合,或跳过它。

这让递归树天然长成一棵二叉树,非常适合初学者理解状态分叉。

如果再叠加去重、和约束、大小约束,就能衍生出组合总和、子集 II 等很多经典题。

它也是理解位运算枚举和 DFS 枚举之间关系的好入口。