全排列

给定一个没有重复数字的序列,返回其所有可能的全排列。

示例:

输入: [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;
}
posted @ 2018-07-18 15:04  onlyandonly  阅读(112)  评论(0编辑  收藏  举报