思路:依然是回溯三部曲。子集也是组合问题,之前的都是收集叶子结点,现在是收集树的所有结点。
- 递归函数的参数:需要用到startIndex,因为在同一个集合里面,来记录搜索的起始位置
- 终止条件:搜索的起始位置>=数组长度
- 单层逻辑:和前面的一样。
要注意的是copy()函数必须放在最前面,不然会漏掉集合为空的情况。
int *path;
int pathTop;
int **result;
int resultTop;
int *length;
void copy(){
int *temp = malloc(sizeof(int)*pathTop);
for(int i=0;i<pathTop;i++)
temp[i] = path[i];
result[resultTop] = temp;
length[resultTop++] = pathTop;
}
void backTrack(int *nums,int numsSize,int start){
copy();
if(start>=numsSize){
return;
}
for(int i=start;i<numsSize;i++){
path[pathTop++] = nums[i];
backTrack(nums,numsSize,i+1);
pathTop--;
}
}
int** subsets(int* nums, int numsSize, int* returnSize, int** returnColumnSizes){
path = malloc(sizeof(int)*numsSize);
result = malloc(sizeof(int*)*10000);
length = malloc(sizeof(int)*10000);
pathTop = resultTop = 0;
backTrack(nums,numsSize,0);
*returnSize = resultTop;
*returnColumnSizes = malloc(sizeof(int)*10000);
for(int i=0;i<resultTop;i++)
(*returnColumnSizes)[i] = length[i];
return result ;
}