78.M 子集

Problem: 78. 子集arrow-up-right

思路

思路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