LeetCode 子集问题:Java 位运算与回溯法解析
一、原题回顾
题目名称:子集
题目编号:LeetCode 78
难度等级:中等
题目描述
给你一个整数数组 nums,数组中的元素 互不相同。返回该数组所有可能的子集(幂集)。
- 解集不能包含重复的子集
- 你可以按任意顺序返回解集
示例
示例 1:输入:nums = [1,2,3] 输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]
示例 2:输入:nums = [0] 输出:[[],[0]]
提示
1 <= nums.length <= 10-10 <= nums[i] <= 10nums中的所有元素 互不相同
二、原题分析
子集问题是组合数学中的基础问题:给定一个包含 n 个不同元素的集合,求其所有子集(包括空集和全集)。对于 n 个元素,共有 2ⁿ 个子集。
本题的关键点:
- 元素无重复 → 无需去重处理
- 子集无序 →
[1,2]和[2,1]视为同一子集(但题目输出为列表,通常按原序) - 输出顺序任意 → 无需排序
由于 n ≤ 10,最大子集数为 2¹⁰ = 1024,属于可枚举范围,适合使用位运算或回溯法。
💡 幂集(Power Set):一个集合 S 的所有子集构成的集合,记作 P(S) 或 2^S。
三、答案构思
3.1 方法一:位运算法(迭代)
核心思想
每个元素有两种状态:在子集中(1)或不在子集中(0)。因此,n 个元素的子集可对应一个 n 位的二进制数(mask)。
例如,nums = [1,2,3]:

