题目描述
leetcode上的78子集,难度为中等
tag:位运算、数组、回溯
给你一个整数数组 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。序列中每个数字的状态有两种,即[在子集中]和[不在子集中]。我们可以用1表示[在子集中],0表示[不在子集中],那么每一个自己可以对应一个长度为n的0/1序列,第i为表示ai是否在子集中。例如,n=2, a={1,2}
| 0/1序列 | 子集 | 0/1序列对应的二进制数 |
|---|---|---|
| 00 | {} | 0 |
| 01 | {1} | 1 |
| 10 | {2} | 2 |
| 11 | {1,2} | 3 |
可以发现 0/1 序列对应的二进制数正好从 0 到 2^n - 1。
解题代码
public List<List<Integer>> subsets(int[] nums) {
List<List<Integer>> lists = new ArrayList<>();
int l = 1<<nums.length;
for(int i=0;i<l;i++){
List<Integer> list = new ArrayList<>();
for(int j=0;j<nums.length;j++){
if((i&(1<<j))!=0) list.add(nums[j]);
}
lists.add(list);
}
return lists;
}
最后
这是[力扣Top100]系列第四篇文章,如果有错误的地方,欢迎指正,如果你有更好的解法,欢迎在评论区讨论。
如果你想了解更多内容,要记得关注我我,我的公众号【小超学编程】。