给定一个可包含重复数字的序列,返回所有不重复的全排列。
示例:
输入: [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%
的用户