Leetcode c语言- Permutations II

Title:

Given a collection of numbers that might contain duplicates, return all possible unique permutations.

For example,
[1,1,2] have the following unique permutations:

[
  [1,1,2],
  [1,2,1],
  [2,1,1]
]

与上一道题类似,但关键在于这道题加入了重复元素这个条件,因此如何解决重复的问题成为这道题的难点,一般而言对于重复性元素的数组,首先对其进行排序,从小到大排序,比如112,然后从左往右数,如果当前元素与后一个元素相等并且后一个元素未被使用,那么说明该元素重复,继续往后数,不对当前元素进行排列,直到发现当前元素与后一个元素不相等,说明该元素是唯一的了,然后对其进行排列,也可能是发现当前元素为最后一个元素了,也说明是唯一的了,然后对其进行排列即可。


solutions:

/**
 * Return an array of arrays of size *returnSize.
 * Note: The returned array must be malloced, assume caller calls free().
 */

void sort(int* nums, int numsSize){
	int i,j;
    int flag=0;
    int temp;

	for (i=0;i<numsSize;i++) {
		for (j=0;j<numsSize-1;j++) {
			if (nums[j+1]<=nums[j]) {
				temp=nums[j];
				nums[j]=nums[j+1];
				nums[j+1]=temp;
				flag=1;
			}
		}
		if (flag==0)
			break;
	}

}

void recursive(int** result,int* nums, int numsSize, int* returnSize,bool* used,int* temp, int size)  
{  
   int i=0;  
  
   if (size==numsSize) {  
    result[*returnSize]=(int*)malloc(sizeof(int)*numsSize);  
    for (i=0;i<numsSize;i++) {  
        result[*returnSize][i]=temp[i];  
    }       
    size=0;  
    (*returnSize)++;  
    return;  
   }  
  
   for (i=0;i<numsSize;i++) {  
    while (nums[i]==nums[i+1] && used[i+1]==false && (i+1)<numsSize) {
         i++;
    }
       
    if (!used[i]) {  
        used[i]=true;  
        temp[size]=nums[i];  
        recursive(result,nums,numsSize,returnSize,used,temp,size+1);  
        used[i]=false;  
  
    }
    
   }  
}  
  
  
int** permuteUnique(int* nums, int numsSize, int* returnSize) {  
    int** result = (int**)malloc(sizeof(int)*1000000);  
    bool* used[numsSize];  
    int* temp[numsSize];  
    int size=0;  
    int i;
    
    if (numsSize==0 || nums==NULL) {  
        *returnSize=0;  
        return result;  
    }  
    *returnSize=0;  
    memset(used,(bool)false,numsSize);  
    sort(nums,numsSize);
    recursive(result,nums,numsSize,returnSize,used,temp,size);  
    return result;  
  
  
}  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值