1+ #include <limits.h>
12#include <stdio.h>
23#include <stdlib.h>
34#include <stdbool.h>
@@ -8,46 +9,39 @@ static inline int compare(const void *a, const void *b)
89 return * (int * ) a - * (int * ) b ;
910}
1011
11- static void dfs (int * nums , int size , int start , int * buf , int level ,
12- bool * used , int * * sets , int * count , int * sizes )
12+ static void dfs (int * nums , int size , int start , int * buf ,
13+ int level , int * * sets , int * count , int * sizes )
1314{
14- int i ;
15+ int i , last = INT_MIN ;
1516 sets [* count ] = malloc (level * sizeof (int ));
1617 memcpy (sets [* count ], buf , level * sizeof (int ));
1718 sizes [* count ] = level ;
1819 (* count )++ ;
1920 for (i = start ; i < size ; i ++ ) {
20- if (!used [i ]) {
21- if (i > 0 && !used [i - 1 ] && nums [i - 1 ] == nums [i ]) {
22- /* Forbid same elements on same level */
23- /* Used marks allow same elements in different levels */
24- continue ;
25- }
26- used [i ] = true;
21+ if (last != nums [i ]) {
22+ /* No duplicate candidate elements at same level position */
2723 buf [level ] = nums [i ];
28- /* i + 1 limits the selecting range in following levels */
29- dfs (nums , size , i + 1 , buf , level + 1 , used , sets , count , sizes );
30- used [i ] = false;
24+ /* i + 1 limits the selecting range in next levels */
25+ dfs (nums , size , i + 1 , buf , level + 1 , sets , count , sizes );
3126 }
27+ last = nums [i ];
3228 }
3329}
3430
3531/**
3632 ** Return an array of arrays of size *returnSize.
3733 ** The sizes of the arrays are returned as *returnColumnSizes array.
38- ** Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().
34+ ** Note: Both returned array and *returnColumnSizes array must be malloced, assume caller calls free().
3935 **/
40- static int * * subsets (int * nums , int numsSize , int * returnSize , int * * returnColumnSizes )
36+ static int * * subsetsWithNoDup (int * nums , int numsSize , int * returnSize , int * * returnColumnSizes )
4137{
4238 qsort (nums , numsSize , sizeof (int ), compare );
4339 int capacity = 5000 ;
4440 int * * sets = malloc (capacity * sizeof (int * ));
4541 int * buf = malloc (numsSize * sizeof (int ));
46- bool * used = malloc (numsSize );
47- memset (used , false, numsSize );
4842 * returnColumnSizes = malloc (capacity * sizeof (int ));
4943 * returnSize = 0 ;
50- dfs (nums , numsSize , 0 , buf , 0 , used , sets , returnSize , * returnColumnSizes );
44+ dfs (nums , numsSize , 0 , buf , 0 , sets , returnSize , * returnColumnSizes );
5145 return sets ;
5246}
5347
0 commit comments