78. 子集-巧用二进制排列法
给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。
解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。
示例 1:
输入:nums = [1,2,3]
输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]
示例 2:
输入:nums = [0]
输出:[[],[0]]
这一题,博主觉得很值得去学习,因为这个题目可以教会我们怎么创建集合的子集,这里很棒的一个方法就是,每个数的二进制01排列是不同的,通过这种方法,我们就可以,列举出,一个集合所有的排序,比如一个大小为3的几个,他的子集数量为8 那么0-7的七个数的01二进制就会有八种,然后,将对应1的位置进行数据取出,就可以很好的解决问题。
解题代码如下:
/**
* Return an array of arrays of size *returnSize.
* The sizes of the arrays are returned as *returnColumnSizes array.
* Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().
*/
int** subsets(int* nums, int numsSize, int* returnSize, int** returnColumnSizes){
int len=1;
for(int i=0;i<numsSize;i++){
len=len*2;
}
int **re=(int **)malloc(sizeof(int*)*len);
(* returnColumnSizes)=(int *)malloc(sizeof(int)*len);
* returnSize=len;
for(int i=0;i<len;i++){
(* returnColumnSizes)[i]=0;
re[i]=(int*)malloc(sizeof(int)*numsSize);
}
int psize=0;
for(int i=0;i<len;i++){
int size=0;
int num=i;
for(int j=0;num>0;j++){
if(num&1){
printf(" %d %d %d|",psize,size,j);
re[psize][size++]=nums[j];
}
num=num>>1;
}
(* returnColumnSizes)[psize]=size;
psize++;
}
return re;
}
这是一个很棒的题目,很建议大家去学习学习。