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] <= 10
nums
中的所有元素 互不相同解题思路:
迭代法实现子集枚举:记录序列中元素的总数为n,原序列中的每个数字ai的状态可能有两种,在子集中和不在子集中。用1代表在子集中,0代表不在子集中。每一个子集可以对应一个长度为n的0/1序列,第i位表示ai是否在子集中。例如:n=3,a={5,2,9}
0/1 序列 子集 0/1 序列对应的二进制数
000 {} 0
001 {9} 1
010 {2} 2
011 {2,9} 3
100 {5} 4
101 {5,9} 5
110 {5,2} 6
111 {5,2,9} 7枚举mask∈【0,2^n-1】,mask的二进制表示一个0/1序列,按照这个0/1序列在原集合当中取数。
int** subsets(int* nums,int numsSize,int* returnSize,int** returnColumnSizes) {int** ans =malloc(sizeof(int*) * (1<<numsSize));*returnColumnSizes = malloc(sizeof(int)*(1<<numsSize));*returnSize = 1<<numsSize;int t[numsSize];for(int mask = 0;mask<(1<<numsSize);mask++){int tSize = 0;for(int i=0;i<numsSize;i++){if(mask & (1<<i)) t[tSize++] = nums[i];}int* tmp = malloc(sizeof(int) * tSize);memcpy(tmp, t, sizeof(int) * tSize);(*returnColumnSizes)[mask] = tSize;ans[mask] = tmp;}return ans; }
子集数量一共是2^n个,包括空集和本身集合。
- 首先计算出2^n是多少
- for循环进行i递增,从0到2^n-1,将每个数字转换为二进制数字
- 将二进制数字每一位的数字对应输出。每一轮循环输出一组数组,即子集。