Leetcode c语言- Permutations II

来源:互联网 发布:美工设计包括哪些 编辑:程序博客网 时间:2024/06/04 19:40

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;      }