1. 题目描述
给定一个 没有重复 数字的序列,返回其所有可能的全排列。
示例:
输入: [1,2,3]
输出:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/permutations
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2.代码如下
int DFS(int ***result,int *array_size,int *nums,const int numsSize,int *cur_ret,int *curnum,int *visited,int **returnColumnSizes)
{
int i = 0;
if (*curnum == numsSize)
{
*returnColumnSizes = realloc(*returnColumnSizes,sizeof(int)*(*array_size + 1));
(*returnColumnSizes)[*array_size] = numsSize;
*result = realloc(*result,sizeof(int *)*(*array_size + 1));
(*result)[*array_size] = malloc(sizeof(int)*numsSize);
memcpy((*result)[*array_size],cur_ret,sizeof(int)*numsSize);
*array_size += 1;
return;
}
for (i = 0; i < numsSize;i++)
{
if (visited[i] == 1)
{
continue;
}
visited[i] = 1;
cur_ret[*curnum] = nums[i];
*curnum += 1;
DFS(result,array_size,nums,numsSize,cur_ret,curnum,visited,returnColumnSizes);
*curnum -= 1;
visited[i] = 0;//回溯关键
}
}
int** permute(int* nums, int numsSize, int* returnSize, int** returnColumnSizes)
{
int i = 0;
int **result = NULL;
int visited[1000] = {
0};
int array_size = 0;
int cur_ret[10000] = {
0};
int cur_num = 0;
int *col = NULL;
DFS(&result,&array_size,nums,numsSize,cur_ret,&cur_num,visited,&col);
*returnSize = array_size;
*returnColumnSizes = col;
return result;
}