|
1 | | -int cmp(const void* a, const void* b) { return *(int*) a - *(int*) b; } |
| 1 | +int cmp(const void* a, const void* b) { |
| 2 | + return *(int*) a - *(int*) b; |
| 3 | +} |
2 | 4 |
|
3 | | -int** threeSum(int* nums, int numsSize, int* returnSize, |
4 | | - int** returnColumnSizes) { |
| 5 | +int** threeSum(int* nums, int numsSize, int* returnSize, int** returnColumnSizes) { |
5 | 6 | *returnSize = 0; |
6 | | - int capacity = 100; |
7 | | - int** result = malloc(capacity * sizeof(int*)); |
8 | | - int* colSizes = malloc(capacity * sizeof(int)); |
9 | | - qsort(nums, numsSize, sizeof(int), cmp); |
| 7 | + int cap = 1000; |
| 8 | + int** ans = (int**) malloc(sizeof(int*) * cap); |
| 9 | + *returnColumnSizes = (int*) malloc(sizeof(int) * cap); |
10 | 10 |
|
11 | | - for (int i = 0; i < numsSize - 2; i++) { |
12 | | - if (nums[i] > 0) |
13 | | - break; |
14 | | - if (i > 0 && nums[i] == nums[i - 1]) |
15 | | - continue; |
| 11 | + qsort(nums, numsSize, sizeof(int), cmp); |
16 | 12 |
|
| 13 | + for (int i = 0; i < numsSize - 2 && nums[i] <= 0; ++i) { |
| 14 | + if (i > 0 && nums[i] == nums[i - 1]) continue; |
17 | 15 | int j = i + 1, k = numsSize - 1; |
18 | 16 | while (j < k) { |
19 | 17 | int sum = nums[i] + nums[j] + nums[k]; |
20 | 18 | if (sum < 0) { |
21 | | - j++; |
| 19 | + ++j; |
22 | 20 | } else if (sum > 0) { |
23 | | - k--; |
| 21 | + --k; |
24 | 22 | } else { |
25 | | - if (*returnSize >= capacity) { |
26 | | - capacity *= 2; |
27 | | - result = realloc(result, capacity * sizeof(int*)); |
28 | | - colSizes = realloc(colSizes, capacity * sizeof(int)); |
| 23 | + if (*returnSize >= cap) { |
| 24 | + cap *= 2; |
| 25 | + ans = (int**) realloc(ans, sizeof(int*) * cap); |
| 26 | + *returnColumnSizes = (int*) realloc(*returnColumnSizes, sizeof(int) * cap); |
29 | 27 | } |
30 | | - |
31 | | - result[*returnSize] = malloc(3 * sizeof(int)); |
32 | | - result[*returnSize][0] = nums[i]; |
33 | | - result[*returnSize][1] = nums[j]; |
34 | | - result[*returnSize][2] = nums[k]; |
35 | | - colSizes[*returnSize] = 3; |
| 28 | + ans[*returnSize] = (int*) malloc(sizeof(int) * 3); |
| 29 | + ans[*returnSize][0] = nums[i]; |
| 30 | + ans[*returnSize][1] = nums[j]; |
| 31 | + ans[*returnSize][2] = nums[k]; |
| 32 | + (*returnColumnSizes)[*returnSize] = 3; |
36 | 33 | (*returnSize)++; |
37 | 34 |
|
38 | | - j++; |
39 | | - k--; |
40 | | - while (j < k && nums[j] == nums[j - 1]) |
41 | | - j++; |
42 | | - while (j < k && nums[k] == nums[k + 1]) |
43 | | - k--; |
| 35 | + ++j; |
| 36 | + --k; |
| 37 | + while (j < k && nums[j] == nums[j - 1]) ++j; |
| 38 | + while (j < k && nums[k] == nums[k + 1]) --k; |
44 | 39 | } |
45 | 40 | } |
46 | 41 | } |
47 | | - |
48 | | - *returnColumnSizes = colSizes; |
49 | | - return result; |
| 42 | + return ans; |
50 | 43 | } |
0 commit comments