@@ -7,22 +7,23 @@ static int compare(const void *a, const void *b)
77 return * (int * ) a - * (int * ) b ;
88}
99
10- static void k_sum (int * nums , int low , int high , int target , int total ,
11- int k , int * stack , int len , int * * results , int * count )
10+ 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 )
1212{
1313 int i ;
1414 if (k == 2 ) {
1515 while (low < high ) {
16- int diff = target - nums [low ];
17- if (diff > nums [ high ] ) {
18- while ( ++ low < high && nums [ low ] == nums [ low - 1 ]) {}
19- } else if (diff < nums [ high ] ) {
20- while ( -- high > low && nums [ high ] == nums [ high + 1 ]) {}
16+ int sum = nums [ low ] + nums [high ];
17+ if (sum < target ) {
18+ low ++ ;
19+ } else if (sum > target ) {
20+ high -- ;
2121 } else {
2222 stack [len ++ ] = nums [low ];
2323 stack [len ++ ] = nums [high ];
2424 results [* count ] = malloc (total * sizeof (int ));
2525 memcpy (results [* count ], stack , total * sizeof (int ));
26+ columnSizes [* count ] = total ;
2627 (* count )++ ;
2728 len -= 2 ;
2829 while (++ low < high && nums [low ] == nums [low - 1 ]) {}
@@ -34,29 +35,28 @@ static void k_sum(int *nums, int low, int high, int target, int total,
3435 for (i = low ; i <= high - k + 1 ; i ++ ) {
3536 if (i > low && nums [i ] == nums [i - 1 ]) continue ;
3637 stack [len ++ ] = nums [i ];
37- k_sum (nums , i + 1 , high , target - nums [i ], 4 , k - 1 , stack , len , results , count );
38+ k_sum (nums , i + 1 , high , target - nums [i ], 4 , k - 1 , stack , len , results , count , columnSizes );
3839 len -- ;
3940 }
4041 }
4142}
4243
4344/**
44- ** Return an array of arrays of size *returnSize.
45- ** Note: The returned array must be malloced, assume caller calls free().
46- **/
47- static int * * fourSum (int * nums , int numsSize , int target , int * returnSize )
48- {
49- if (numsSize < 4 ) {
50- return NULL ;
51- }
52-
53- qsort (nums , numsSize , sizeof (* nums ), compare );
54-
45+ * Return an array of arrays of size *returnSize.
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().
48+ */
49+ int * * fourSum (int * nums , int numsSize , int target , int * returnSize , int * * returnColumnSizes ) {
5550 * returnSize = 0 ;
5651 int i , j , capacity = 50000 ;
5752 int * * results = malloc (capacity * sizeof (int * ));
58- int * stack = malloc (4 * sizeof (int ));
59- k_sum (nums , 0 , numsSize - 1 , target , 4 , 4 , stack , 0 , results , returnSize );
53+ * returnColumnSizes = malloc (capacity * sizeof (int ));
54+
55+ if (numsSize >= 4 ) {
56+ qsort (nums , numsSize , sizeof (* nums ), compare );
57+ int * stack = malloc (4 * sizeof (int ));
58+ k_sum (nums , 0 , numsSize - 1 , target , 4 , 4 , stack , 0 , results , returnSize , * returnColumnSizes );
59+ }
6060 return results ;
6161}
6262
0 commit comments