回溯法之全排列II C语言

给定一个可包含重复数字的序列,返回所有不重复的全排列。

示例:

输入: [1,1,2]
输出: [ [1,1,2], [1,2,1], [2,1,1] ]

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/permutations-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

/**
 * 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* a,int *returnSize,int numsSize,int* nums)
 {
     if(i==numsSize)
     {
        a[(*returnSize)]=numsSize;
       returnColumnSizes[(*returnSize)]=(int*)malloc(numsSize*sizeof(int)) ;
      memcpy(returnColumnSizes[(*returnSize)],nums,numsSize*sizeof(int));
       (*returnSize)++;
      
     }
     else   
     {  bool cut[100]={false};
         for(int j =i;j<numsSize;j++)
         {
             if(cut[(nums[j])+10]==true) continue;
             (cut[(nums[j])+10])=true;
            int m=nums[i];
            nums[i]=nums[j];
            nums[j]=m;
             backTrack(i+1,returnColumnSizes,a,returnSize,numsSize,nums);
             m=nums[i];
            nums[i]=nums[j];
            nums[j]=m;
         }
     }
 }
int** permuteUnique(int* nums, int numsSize, int* returnSize, int** returnColumnSizes){
       //这一道题相对于全排列1来说,变动有2点,第一点就是它提供的数里边有了重复,第二点就是
       //返回的所有数列里不准有重复的
       //思考一下,以回溯法的排列树来说,其实只要改改一个条件,就是剪枝——剪去两个相等的排列,具体看代码
       *returnSize=0;
    int n=1;
    for(int i=1;i<=numsSize;i++)
    {
        n=n*i;
    }
    int** target =(int**)malloc(n*sizeof(int*));
    *returnColumnSizes=(int*)malloc(n*sizeof(int));
    backTrack(0,target,*returnColumnSizes,returnSize,numsSize,nums);
    return target;

}

执行用时 :
24 ms
, 在所有 c 提交中击败了
94.00%
的用户
内存消耗 :
10.1 MB
, 在所有 c 提交中击败了
50.00%
的用户

发布了37 篇原创文章 · 获赞 1 · 访问量 648

猜你喜欢

转载自blog.csdn.net/zzuzhaohp/article/details/103570088
今日推荐