原题:
给你一个整数数组 nums
,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。
解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。
官方思路:
官方代码:
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;
}
我的代码:
#include <stdio.h>
#include <math.h>
int main()
{
int Input[100], InuptNnums, output[100][100];
printf("请输入数组元素个数: ");
scanf("%d", &InuptNnums);
printf("请依次输入数组元素: ");
for(int i = 0; i < InuptNnums; i++)
{
scanf("%d", &Input[i]);
}
for(int i = 0; i < pow(2, InuptNnums); i++)
{
printf("[ ");
for(int j = 0; j < InuptNnums; j++)
{
output[i][j] = (i & (0x1 << j)) >> j;
if(output[i][j] == 1)
{
printf("%d,", Input[j]);
}
}
printf("\b ]\n");
}
return 0;
}