From d1d3b28341c6f13ca0cc9ee2fd66f5f82af9575c Mon Sep 17 00:00:00 2001 From: Guanzhong Pan Date: Mon, 29 Nov 2021 11:56:50 +0000 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200015.=E4=B8=89=E6=95=B0?= =?UTF-8?q?=E4=B9=8B=E5=92=8C.md=20C=E8=AF=AD=E8=A8=80=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0015.三数之和.md | 74 +++++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) diff --git a/problems/0015.三数之和.md b/problems/0015.三数之和.md index dec8a7c6..1e675254 100644 --- a/problems/0015.三数之和.md +++ b/problems/0015.三数之和.md @@ -435,5 +435,79 @@ func threeSum(_ nums: [Int]) -> [[Int]] { } ``` +C: +```C +//qsort辅助cmp函数 +int cmp(const void* ptr1, const void* ptr2) { + return *((int*)ptr1) > *((int*)ptr2); +} + +int** threeSum(int* nums, int numsSize, int* returnSize, int** returnColumnSizes) { + //开辟ans数组空间 + int **ans = (int**)malloc(sizeof(int*) * 18000); + int ansTop = 0; + //若传入nums数组大小小于3,则需要返回数组大小为0 + if(numsSize < 3) { + *returnSize = 0; + return ans; + } + //对nums数组进行排序 + qsort(nums, numsSize, sizeof(int), cmp); + + + int i; + //用for循环遍历数组,结束条件为i < numsSize - 2(因为要预留左右指针的位置) + for(i = 0; i < numsSize - 2; i++) { + //若当前i指向元素>0,则代表left和right以及i的和大于0。直接break + if(nums[i] > 0) + break; + //去重:i > 0 && nums[i] == nums[i-1] + if(i > 0 && nums[i] == nums[i-1]) + continue; + //定义左指针和右指针 + int left = i + 1; + int right = numsSize - 1; + //当右指针比左指针大时进行循环 + while(right > left) { + //求出三数之和 + int sum = nums[right] + nums[left] + nums[i]; + //若和小于0,则左指针+1(因为左指针右边的数比当前所指元素大) + if(sum < 0) + left++; + //若和大于0,则将右指针-1 + else if(sum > 0) + right--; + //若和等于0 + else { + //开辟一个大小为3的数组空间,存入nums[i], nums[left]和nums[right] + int* arr = (int*)malloc(sizeof(int) * 3); + arr[0] = nums[i]; + arr[1] = nums[left]; + arr[2] = nums[right]; + //将开辟数组存入ans中 + ans[ansTop++] = arr; + //去重 + while(right > left && nums[right] == nums[right - 1]) + right--; + while(left < right && nums[left] == nums[left + 1]) + left++; + //更新左右指针 + left++; + right--; + } + } + } + + //设定返回的数组大小 + *returnSize = ansTop; + *returnColumnSizes = (int*)malloc(sizeof(int) * ansTop); + int z; + for(z = 0; z < ansTop; z++) { + (*returnColumnSizes)[z] = 3; + } + return ans; +} +``` + -----------------------