-
Notifications
You must be signed in to change notification settings - Fork 16
/
Copy path039-Combination Sum.c
37 lines (37 loc) · 1.38 KB
/
039-Combination Sum.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
/**
* Return an array of arrays of size *returnSize.
* The sizes of the arrays are returned as *columnSizes array.
* Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().
*/
void recurFind(int* candidates, int candidatesSize, int target, int **res,
int** columnSizes, int* returnSize, int stack[], int top, int cursum) {
if (cursum > target) {
return;
}
if (cursum == target) {
res[(*returnSize)] = malloc(top * sizeof(int));
(* columnSizes)[(*returnSize)] = top;
int i;
for (i = 0 ; i < top ; i++) {
res[(*returnSize)][i] = stack[i];
}
(*returnSize)++;
return;
}
int i;
for (i = 0 ; i < candidatesSize ; i++) {
if (top > 0 && candidates[i] < stack[top-1]) continue;
stack[top++] = candidates[i];
recurFind(candidates, candidatesSize, target, res, columnSizes, returnSize, stack, top, cursum + candidates[i]);
top--;
}
}
int** combinationSum(int* candidates, int candidatesSize, int target, int** columnSizes, int* returnSize) {
int stack[1000];
int ** res = malloc(1000 * sizeof(int *));
(* columnSizes) = malloc(1000 * sizeof(int));
(* returnSize) = 0;
int cursum = 0, top = 0;
recurFind(candidates, candidatesSize, target, res, columnSizes, returnSize, stack, top, cursum);
return res;
}