全排列
给定一个没有重复数字的序列,返回其所有可能的全排列。
示例:
输入: [1,2,3] 输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ]
多了个visited的回溯。
有人用交换地方法解了这题,感觉很神奇,思路就是交换,递归,再交换回来,如此这样迭代下去。时空复杂度会小一点。
/** * Return an array of arrays of size *returnSize. * Note: The returned array must be malloced, assume caller calls free(). */ void mute(int** a,int* visited,int* s,int *nums,int* top,int* size,int n) { int i; if(*top==n) { int i; for(i=0;i<n;i++) a[*size][i]=s[i]; (*size)++; return; } for(i=0; i<n; i++) { if(!visited[i]) { visited[i]=1; s[*top]=nums[i]; (*top)++; mute(a,visited,s,nums,top,size,n); (*top)--; visited[i]=0; } } } int** permute(int* nums, int numsSize, int* returnSize) { int i,size=1; for(i=1;i<=numsSize;i++) size*=i; *returnSize=size; int **a=(int **)malloc(sizeof(int *)*size); for(i=0;i<size;i++) a[i]=(int *)malloc(sizeof(int)*numsSize); int *s=(int *)malloc(sizeof(int)*numsSize); int *visited=(int *)malloc(sizeof(int)*numsSize); for(i=0;i<numsSize;i++) visited[i]=0; int top=0,rear=0; mute(a,visited,s,nums,&top,&rear,numsSize); return a; }