/**
* 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*size;voidbacktracking(int*nums,int numsSize,int*returnSize,int**ans,int pathidx,int*path,int startidx){
ans[*returnSize]=(int*)malloc(sizeof(int)*(pathidx+1));for(int i =0; i < pathidx; i++){
ans[*returnSize][i]= path[i];}
size[*returnSize]= pathidx;(*returnSize)++;if(startidx == numsSize)return;for(int i = startidx; i < numsSize; i++){
path[pathidx]= nums[i];backtracking(nums, numsSize, returnSize, ans, pathidx+1, path, i+1);}}int**subsets(int* nums,int numsSize,int* returnSize,int** returnColumnSizes){int**ans =(int**)malloc(sizeof(int*)*10000);int*path =(int*)malloc(sizeof(int)*10);
size =(int*)malloc(sizeof(int)*10000);memset(path,0,sizeof(path));*returnSize =0;backtracking(nums, numsSize, returnSize, ans,0, path,0);*returnColumnSizes =(int*)malloc(sizeof(int)**returnSize);for(int i =0; i <*returnSize; i++){(*returnColumnSizes)[i]= size[i];}return ans;}
/**
* 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*size =NULL;intcmp(constvoid* a,constvoid* b){return*((int*)a)-*((int*)b);}voidbacktracking(int*nums,int numsSize,int*returnSize,int**ans,int pathidx,int*path,int statidx){
ans[*returnSize]=(int*)malloc(sizeof(int)*(pathidx+1));for(int i =0; i < pathidx; i++){
ans[*returnSize][i]= path[i];}
size[*returnSize]= pathidx;(*returnSize)++;if(statidx == numsSize)return;for(int i = statidx; i < numsSize; i++){if(i > statidx && nums[i]== nums[i-1])continue;
path[pathidx]= nums[i];backtracking(nums, numsSize, returnSize, ans, pathidx+1, path, i+1);}}int**subsetsWithDup(int* nums,int numsSize,int* returnSize,int** returnColumnSizes){
size =(int*)malloc(sizeof(int)*10000);int**ans =(int**)malloc(sizeof(int*)*10000);int*path =(int*)malloc(sizeof(int)*10);qsort(nums, numsSize,sizeof(int), cmp);memset(path,0,sizeof(path));*returnSize =0;backtracking(nums, numsSize, returnSize, ans,0, path,0);*returnColumnSizes =(int*)malloc(sizeof(int)**returnSize);for(int i =0; i <*returnSize; i++){(*returnColumnSizes)[i]= size[i];}return ans;}