力扣(LeetCode)15. 三数之和(C++/C语言)

该博客介绍了如何使用C语言和C++解决LeetCode上的15题——三数之和问题。通过快速排序和对撞指针的方法,将时间复杂度降低到O(n^2),避免了原始的三重循环导致的高复杂度。博主详细讲解了代码实现,并提供了完整的AC代码,包括剪枝策略和避免重复三元组的处理。最后分析了时间复杂度为O(n^2+nlogn),空间复杂度为O(logn)。

一、环境说明

  1. 本文是 LeetCode 15题 : 三数之和,使用c语言实现。
  2. 快排+对撞指针。
  3. 测试环境:Visual Studio 2019。

二、代码展示

C

//排序,双指针向中间对撞
int cmp(const void *a,const void *b){
   
   
    return *(int*)a > *(int*)b;//升序
}
int** threeSum(int* nums, int numsSize, int* returnSize, int** returnColumnSizes) {
   
   
    qsort(nums, numsSize, sizeof(int), cmp);//快排
    int** ans = (int**)malloc(sizeof(int*) * numsSize * (numsSize-1)/2);//Cn-2种组合
    *returnSize = 0;//返回值大小从0开始
    *returnColumnSizes = (int*)malloc(sizeof(int) * numsSize * (numsSize-1)/2);//三元组最大数量
    for (int i = 0; i < numsSize; ++i) {
   
   
        if (nums[i] > 0) {
   
   //剪枝
            break;
        }
        if (i > 0 && nums[i] == nums[i - 1]) {
   
   //当前数和上一个数重复,结果重复。
            continue;
        }
        int left = i + 1, right = numsSize - 1;//左指针是第二个数,从第一个数的右一位出发向右; 右指针是第三个数,从右边界向左。
        while (left < right) {
   
   //左右不能颠倒
            int sum = nums[left] + nums[right] + nums[i];
            if (sum == 0) {
   
   //保存一个答案
                ans[*returnSize] = (int*)malloc(sizeof(int) * 3);
                (*returnColumnSizes)[*returnSize] = 3;
                ans[*returnSize][0] = nums[i];
                ans[*returnSize][1] = nums[left];
                ans[*returnSize][2] = nums[right];
                (*returnSize)++;
                while ((left < right) && (nums[left] == nums[left+1
评论 18
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清墨韵染

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值