78. 子集-巧用二进制排列法

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;

}

这是一个很棒的题目,很建议大家去学习学习。

你可能感兴趣的:(力扣刷题,c++与c语言,算法,数据结构,leetcode)