78.M 子集
Problem: 78. 子集
思路
思路1:回溯法
核心思想:通过递归遍历每个元素的 “选” 与 “不选” 状态,生成所有可能的子集组合。
状态定义:
path:存储当前递归路径上已选择的元素。
start:当前遍历的起始索引,避免重复选择前面的元素(如选了 1 后,后续只能从 2 开始选,避免生成 [1,1])。
递归流程:
记录当前状态:每次进入递归时,先将当前path深拷贝后存入结果集(包括空集)。
选择元素:从start开始遍历数组,依次选择当前元素加入path,并递归处理下一层(起始索引为i+1)。
回溯:递归返回后,移除最后一个元素,尝试其他组合。
时间复杂度:O (n×2ⁿ),生成 2ⁿ个子集,每个子集拷贝需 O (n)。
思路2:位运算枚举法
核心思想:利用二进制掩码(mask)表示元素的选择状态,每一位代表对应索引的元素是否被选中。所有掩码处理完后,得到所有子集。
时间复杂度:O (n×2ⁿ),枚举 2ⁿ个掩码,每个掩码检查 n 位。
Code
代码1:
代码2:
Last updated