回溯法之全排列 C语言

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

示例:

输入: [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

哎呀,实在是搞不定这个领扣的参数问题,头都大了,很简单的一个问题非用参数难住我
把我失败的代码放在这以供参考

/**
 * 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 backTrack(int i,int** returnColumnSizes,int *returnSize,int numsSize,int* nums)
 {
     if(i==numsSize-1)
     {
         *returnSize++;
      returnColumnSizes[*returnSize]=nums;

     }
     else
     {
         for(int j =i;j<numsSize;j++)
         {
            int m=nums[i];
            nums[i]=nums[j];
            nums[j]=m;
             backTrack(i+1,returnColumnSizes,returnSize,numsSize,nums);
             m=nums[i];
            nums[i]=nums[j];
            nums[j]=m;
         }
     }
 }
int** permute(int* nums, int numsSize, int* returnSize, int** returnColumnSizes){
    int temp=-1;
    returnSize=& temp;
    returnColumnSizes=(int**)malloc(100*sizeof(int*));
    backTrack(0,returnColumnSizes,returnSize,numsSize,nums);
    return returnColumnSizes;
}

**思路很简单这道题,就是回溯法中的排列树,还是没有剪枝的排列树,

这是框架,以后所有的类似的题目都可以套用这个框架**

void BackTrack(int i)//i是第几个数
{
if(i>n)
{//说明到底了
将这个一维数组放到返回的二维数组中;
}

else
{
for(int t=i;t<=n;n++)
swap(x[t],x[n]);//交换位置后 例如:1,2交换,变成2,1,3,别管1和3 现在2在第一位
//递归,求以2开头的排列有多少种
BackTrack(i+1);
//把位置换回来
swap(x[t],x[n]);
//继续下一次循环  例如:下一次循环把3放在第一位,求以三开头的序列
 
}
发布了37 篇原创文章 · 获赞 1 · 访问量 651

猜你喜欢

转载自blog.csdn.net/zzuzhaohp/article/details/103515723