|
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