《LeetCode力扣练习》第16题 C语言版 (做出来就行,别问我效率。。。。)

库你急哇,哈集美马戏特~~

看完题目,哦,三层循环,简单粗暴

提交之后,emm,不愧是我

本题采用和上题一样的思路,双指针,并使用排除重复优化,如果上一题做出来,这题就没什么问题了。这次在优化过程中,采用了更像是人看的代码优化方式,比上一题看起来好多了

题目:
力扣官方题库

上代码(经过线上OJ测试)

#include <stdio.h>
#include <stdlib.h>

int compareByIncrease(const void *a,const void *b)
{
    return *(int*)a-*(int*)b;
}

int threeSumClosest(int* nums, int numsSize, int target){

    qsort(nums,numsSize,sizeof(int),compareByIncrease);

    int min=100000;
    int cur=0;
    int sum=0;
    int low=cur+1,high=numsSize-1;

    for(cur=0;cur<numsSize-1;cur++)
    {
        if(cur>0&&nums[cur]==nums[cur-1])
        {
            continue;
        }
        low=cur+1;
        high=numsSize-1;
        while(low<high)
        {
            sum=nums[cur]+nums[low]+nums[high];

            if(sum==target)
            {
                return target;
            }

            if(abs(sum-target)<abs(min-target))
            {
                min=sum;
            }

            if(sum>target)
            {
                --high;
                for(;low<high;--high)
                {
                    if(nums[high]!=nums[high+1])
                    {
                        break;
                    }
                }
            }

            if(sum<target)
            {
                ++low;
                for(;low<high;++low)
                {
                    if(nums[low]!=nums[low-1])
                    {
                        break;
                    }
                }
            }
        }
    }
    return min;
}


int main()
{
    int nums[]={-1,2,1,-4};
    int numsSize=4;
    int target=1;
    printf("%d",threeSumClosest(nums,numsSize,target));
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值