一.题目
给定一个没有重复数字的序列,返回其所有可能的全排列。
示例:
输入: [1,2,3]
输出:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]
二.代码(C)
/**
* 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().
*/
void swap(int* a,int* b)
{
int temp = *a;
*a = *b;
*b = temp;
}
void backtrack(int first, int* j,int* nums,int numsSize,int* returnSize, int** returnColumnSizes,int **y);
int mult(int a)
{
int y=1;
while(a)
{
y *= a;
a--;
}
//printf("%d",y);
return y;
}
int** permute(int* nums, int numsSize, int* returnSize, int** returnColumnSizes)
{
int** y;
int x = mult(numsSize);
y = (int**)malloc(x*sizeof(int*));
*returnColumnSizes = (int*)malloc(x*sizeof(int));
*returnSize = x;
int i,first,j;
first = 0;
j=0;
backtrack(first,&j,nums,numsSize,returnSize,returnColumnSizes,y);
return y;
}
void backtrack(int first, int* j,int* nums,int numsSize,int* returnSize, int** returnColumnSizes,int **y)
{
if(first==numsSize-1)
{
//printf("j = %d\t",*j);
(*returnColumnSizes)[*j] = (int*)malloc(sizeof(int));
(*returnColumnSizes)[*j] = numsSize;
y[*j] = (int*)malloc(numsSize*sizeof(int));
//printf("123\t");
for(int k=0;k<numsSize;k++)
{
y[*j][k] = nums[k];
//printf("%d",nums[k]);
}
//printf("\n");
*j = *j+1;
}
//printf("first=%d\n",first);
for(int i=first;i<numsSize;i++)
{
swap(&nums[first],&nums[i]);
backtrack(first+1,j,nums,numsSize,returnSize,returnColumnSizes,y);
swap(&nums[first],&nums[i]);
}
return;
}
三.提交记录
四.备注
回溯法