这道题有很多种思路,我这个是利用一个数组记录已经使用过的数字,持续深搜,当记录的数字等于numsSize时,保存,结束调用,回溯上一步。
void swap(int *p,int *q){
int temp;
temp=*p;
*p=*q;
*q=temp;
}
void dfs(int *item,int count,int *nums,int n,int *b,int ***arr,int *returnSize)
{
if(count==n)
{
(*returnSize)++;
*arr=realloc(*arr,sizeof(int*)*(*returnSize));
(*arr)[*returnSize-1]=malloc(sizeof(int)*n);
memcpy((*arr)[*returnSize-1],item,sizeof(int)*n);
return;
}
int i;
for(i=0;i<n;i++){
if(b[i]==0)
{
b[i]=1;
item[count]=nums[i];
dfs(item,count+1,nums,n,b,arr,returnSize);
b[i]=0;
item[count]=0;
}
}
}
int** permute(int* nums, int numsSize, int* returnSize, int** returnColumnSizes){
if(!nums)
return NULL;
int *b=malloc(sizeof(int)*numsSize);
int *item=malloc(sizeof(int)*numsSize);
int **ret=malloc(sizeof(int*));
memset(b,0,sizeof(int)*numsSize);
memset(item,0,sizeof(int)*numsSize);
*returnSize=0;
dfs(item,0,nums,numsSize,b,&ret,returnSize);
int *col=malloc(sizeof(int)*(*returnSize));
for(int i=0;i<(*returnSize);i++)
col[i]=numsSize;
*returnColumnSizes=col;
return ret;
}