2
2
#include <stdlib.h>
3
3
#include <string.h>
4
4
5
+
5
6
static int compare (const void * a ,const void * b )
6
7
{
7
8
return * (int * )a - * (int * )b ;
8
9
}
9
10
10
11
static void k_sum (int * nums ,int low ,int high ,int target ,int total ,int k ,
11
- int * stack ,int len ,int * * results ,int * count ,int * columnSizes )
12
+ int * stack ,int len ,int * * results ,int * count ,int * col_sizes )
12
13
{
13
14
int i ;
14
15
if (k == 2 ) {
@@ -23,7 +24,7 @@ static void k_sum(int *nums, int low, int high, int target, int total, int k,
23
24
stack [len ++ ]= nums [high ];
24
25
results [* count ]= malloc (total * sizeof (int ));
25
26
memcpy (results [* count ],stack ,total * sizeof (int ));
26
- columnSizes [* count ]= total ;
27
+ col_sizes [* count ]= total ;
27
28
(* count )++ ;
28
29
len -= 2 ;
29
30
while (++ low < high && nums [low ]== nums [low - 1 ]) {}
@@ -34,19 +35,19 @@ static void k_sum(int *nums, int low, int high, int target, int total, int k,
34
35
/* k > 2 */
35
36
for (i = low ;i <=high - k + 1 ;i ++ ) {
36
37
if (i > low && nums [i ]== nums [i - 1 ])continue ;
37
- stack [len ++ ]= nums [i ];
38
- k_sum (nums ,i + 1 ,high ,target - nums [i ],4 ,k - 1 ,stack ,len ,results ,count ,columnSizes );
39
- len -- ;
38
+ stack [len ]= nums [i ];
39
+ k_sum (nums ,i + 1 ,high ,target - nums [i ],4 ,k - 1 ,stack ,len + 1 ,results ,count ,col_sizes );
40
40
}
41
41
}
42
42
}
43
43
44
44
/**
45
45
* Return an array of arrays of size *returnSize.
46
46
* The sizes of the arrays are returned as *returnColumnSizes array.
47
- * Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().
47
+ * Note: Both returned array and *returnColumnSizes array must be malloced, assume caller calls free().
48
48
*/
49
- int * * fourSum (int * nums ,int numsSize ,int target ,int * returnSize ,int * * returnColumnSizes ) {
49
+ int * * fourSum (int * nums ,int numsSize ,int target ,int * returnSize ,int * * returnColumnSizes )
50
+ {
50
51
* returnSize = 0 ;
51
52
int i ,j ,capacity = 50000 ;
52
53
int * * results = malloc (capacity * sizeof (int * ));
@@ -62,11 +63,11 @@ int** fourSum(int* nums, int numsSize, int target, int* returnSize, int** return
62
63
63
64
int main (void )
64
65
{
65
- int i ,count ;
66
+ int i ,count , target = 11 , * col_sizes ;
66
67
//int nums[] = { 1, 0, -1, 0, -2, 2 };
67
68
//int nums[] = { -3, -2, -1, 0, 0, 1, 2, 3 };
68
69
int nums []= {0 ,1 ,5 ,0 ,1 ,5 ,5 ,-4 };
69
- int * * quadruplets = fourSum (nums ,sizeof (nums ) /sizeof (* nums ),11 ,& count );
70
+ int * * quadruplets = fourSum (nums ,sizeof (nums ) /sizeof (* nums ),target ,& count , & col_sizes );
70
71
for (i = 0 ;i < count ;i ++ ) {
71
72
printf ("%d %d %d %d\n" ,quadruplets [i ][0 ],quadruplets [i ][1 ],quadruplets [i ][2 ],quadruplets [i ][3 ]);
72
73
}