网站开发和合同,装修公司哪家产品好,wordpress特点,网页设计网站设计哪个好给你一个整数数组nums#xff0c;数组中的元素互不相同。返回该数组所有可能的子集。 解集不能包含重复的子集。你可以按任意顺序返回解集。 示例1#xff1a; 输入#xff1a;nums [1,2,3]
输出#xff1a;[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]] 示例2#xff1a;… 给你一个整数数组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原序列中的每个数字ai的状态可能有两种在子集中和不在子集中。用1代表在子集中0代表不在子集中。每一个子集可以对应一个长度为n的0/1序列第i位表示ai是否在子集中。例如n3a{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∈【02^n-1】,mask的二进制表示一个0/1序列按照这个0/1序列在原集合当中取数。 int** subsets(int* nums,int numsSize,int* returnSize,int** returnColumnSizes)
{int** ans malloc(sizeof(int*) * (1numsSize));*returnColumnSizes malloc(sizeof(int)*(1numsSize));*returnSize 1numsSize;int t[numsSize];for(int mask 0;mask(1numsSize);mask){int tSize 0;for(int i0;inumsSize;i){if(mask (1i)) 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将每个数字转换为二进制数字将二进制数字每一位的数字对应输出。每一轮循环输出一组数组即子集。