Skip to content

Commit 84a3c6a

Browse files
authored
Merge pull request #2780 from mdmzfzl/main
Create: 0090-subsets-ii.c
2 parents 1851d9a + 4d04284 commit 84a3c6a

File tree

1 file changed

+40
-0
lines changed

1 file changed

+40
-0
lines changed

Diff for: c/0090-subsets-ii.c

+40
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
void backtrack(int* nums, int numsSize, int start, int* subset, int subsetSize, int*** result, int* resultSize, int** resultColSizes) {
2+
// Add the current subset to the result set
3+
*result = (int**)realloc(*result, (*resultSize + 1) * sizeof(int*));
4+
(*result)[*resultSize] = (int*)malloc(subsetSize * sizeof(int));
5+
for (int i = 0; i < subsetSize; i++) {
6+
(*result)[*resultSize][i] = subset[i];
7+
}
8+
(*resultColSizes) = (int*)realloc(*resultColSizes, (*resultSize + 1) * sizeof(int));
9+
(*resultColSizes)[*resultSize] = subsetSize;
10+
(*resultSize)++;
11+
12+
// Backtracking
13+
for (int i = start; i < numsSize; i++) {
14+
// Skip duplicates to avoid duplicates in subsets
15+
if (i > start && nums[i] == nums[i - 1]) {
16+
continue;
17+
}
18+
19+
subset[subsetSize] = nums[i];
20+
backtrack(nums, numsSize, i + 1, subset, subsetSize + 1, result, resultSize, resultColSizes);
21+
}
22+
}
23+
24+
int compare(const void* a, const void* b) {
25+
return *(int*)a - *(int*)b;
26+
}
27+
28+
int** subsetsWithDup(int* nums, int numsSize, int* returnSize, int** returnColumnSizes) {
29+
qsort(nums, numsSize, sizeof(int), compare);
30+
int** result = NULL;
31+
int* resultColSizes = NULL;
32+
int* subset = (int*)malloc(numsSize * sizeof(int));
33+
*returnSize = 0;
34+
35+
backtrack(nums, numsSize, 0, subset, 0, &result, returnSize, &resultColSizes);
36+
37+
*returnColumnSizes = resultColSizes;
38+
free(subset);
39+
return result;
40+
}

0 commit comments

Comments
 (0)