78. 子集 c语言

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 中的所有元素 互不相同
/**
 * 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){

/*这个题原来打算用递归回溯的 也可以
但查资料的时候发现一个位运算法
也就是用0表示没有 1 表示有 对于示例1  001
表示 【3】。所以一共有2^numsSize个结果
*/
*returnSize = 1<<numsSize;
*returnColumnSizes = (int *)malloc(sizeof(int )*(*returnSize));
**returnColumnSizes = 0;
//printf("%d",*returnSize);
 int **res  =(int **)malloc(sizeof(int *)*(*returnSize));
 //先把【】输入到里面
 res[0]=NULL;
  //从1 到 *returnSize进行遍历,每次查看第几位为1
 for(int i = 1;i<*returnSize;i++)
  {
      res[i]=(int *)malloc(sizeof(int)*numsSize);
      returnColumnSizes[0][i]=0;
      for(int j = 0;j<numsSize;j++)
      {
          if(1<<j&i)
          {
              res[i][ returnColumnSizes[0][i]++]=nums[j];
          }
      }
  }
  return res;
}    

总结

1、这种题结果里面有一个【】, 而且是一个整数二维数组,这个解决办法是题中要求你返回一个列的大小,所以不用管二维数组怎么写,就只把returnColumnSizes[0][i]=0; 这样就可以了
2、这里面的采用位运算来代替2的乘方 很巧妙
3、这道题的这种思想也很是巧妙,直接转化为数字的遍历
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值