赞
踩
// 两种思路: // 递归//深度优先//回溯 // 01编码,迭代求解。 int** subsets(int* nums, int numsSize, int* returnSize, int** returnColumnSizes){ //长度n的集合,子集个数为2的n次方-1. int row = 1<<numsSize; int **ans = (int**)calloc(row,sizeof(int*)); *returnSize = row; *returnColumnSizes = (int*)calloc(row,sizeof(int));//一共2的n次方行 int *path=(int*)calloc(numsSize,sizeof(int));//子序列 //01编码,迭代求解。 for(int i = 0;i<(1<<numsSize);i++){ int column=0;//列数 for(int j =0;j<numsSize;j++){ if(i&(1<<j)){//对i的每一位尝试构造子集 path[column++]=nums[j];//如果i的第j个二进制位是1,则nums[j]元素入路径path。 } } int *temp = (int*)calloc(column,sizeof(int)); memcpy(temp,path,column*sizeof(int)); returnColumnSizes[0][i]=column; ans[i]=temp; } return ans; }
int **ans; int *ansColumnSize; int ansSize; int *path; int pathSize; void dfs(int cur,int nums[],int numsSize){ if(cur == numsSize){//构成了一个子集//保存,弹栈 int *temp = (int*)calloc(pathSize,sizeof(int)); memcpy(temp,path,pathSize*sizeof(int)); ansColumnSize[ansSize] = pathSize;//路径大小入答案 ans[ansSize++]=temp;//ans[ansSize]指向当前路径,答案规模++ return; } //递归体编写 path[pathSize++] = nums[cur];//尝试所有可能 dfs(cur+1,nums,numsSize);//一路向前 pathSize--;//回溯 dfs(cur+1,nums,numsSize); } int** subsets(int* nums, int numsSize, int* returnSize, int** returnColumnSizes) { ans = malloc(sizeof(int*) * (1 << numsSize)); ansColumnSize = malloc(sizeof(int) * (1 << numsSize)); path = malloc(sizeof(int) * numsSize); *returnSize = 1 << numsSize; ansSize = pathSize = 0; dfs(0, nums, numsSize); *returnColumnSizes = ansColumnSize; return ans; }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。