力扣 46. 全排列(回溯)
注意:可以在最外面定义全局变量
//定义全局ret保存数据
int** ret;
int ret_len=0;
//定义暂存数组保存遍历元素
int* zj;
int zj_len=0;
//标记使用数组定义
int surv[6]={0,0,0,0,0,0};
void dfs(int* nums,int numsSize,int *returnSize,int** returnColumnSizes){
if(zj_len==numsSize){
//(回溯)递归出口
ret[*returnSize]=(int*)malloc(sizeof(int)*numsSize);
//int和char都可以直接memcpy
memcpy(ret[*returnSize],zj,sizeof(int)*zj_len);
(*returnColumnSizes)[*returnSize]=numsSize;
(*returnSize)++;
return;
}
for(int j=0;j<numsSize;j++){
if(surv[j]==1)continue;
surv[j]=1;//将数字所在位置的下标置1下面的递归不在访问
zj[zj_len++]=nums[j];//将数字暂存到暂存数组
dfs(nums,numsSize,returnSize,returnColumnSizes);//没到if一直进入dfs
zj_len--;//暂存数组退1位
surv[j]=0;//重新置为0
}
}
int** permute(int* nums, int numsSize, int* returnSize, int** returnColumnSizes){
//二维数组的定义
*returnColumnSizes=(int*)malloc(sizeof(int)*720);
//return数组定义
ret=(int**)malloc(sizeof(int*)*720);
//暂存数组定义
zj=(int*)malloc(sizeof(int)*numsSize);
//*returnSize的初始大小
* returnSize=0;
dfs(nums,numsSize,returnSize,returnColumnSizes);
return ret;
}