每日一道算法题 最接近的三数之和

题目

16. 最接近的三数之和 - 力扣(LeetCode)

Python

class Solution:
    def threeSumClosest(self, nums: List[int], target: int) -> int:
        nums.sort()
        n=len(nums)
        ans=0
        min_diff=inf  # infinite 无穷
        for i in range(n-2):
            tmp=nums[i]
            l=i+1
            r=n-1
            while l<r:
                s=tmp+nums[l]+nums[r]

                if s==target:
                    return s
                elif s>target:
                    r-=1
                else:
                    l+=1
                if abs(s-target)<min_diff:
                    min_diff=abs(s-target)
                    ans=s
        return ans

C++

class Solution {
public:
    int threeSumClosest(vector<int>& nums, int target) 
    {
        sort(nums.begin(),nums.end());
        int ans=0;
        int n=nums.size();
        int min_diff=INT_MAX;
        for(int i=0;i<n-2;i++)
        {
            int tmp=nums[i];
            int l=i+1;
            int r=n-1;
            while(l<r)
            {
                int s=tmp+nums[l]+nums[r];
                if(s==target) return s;
                else if(s>target)
                 {
                    r-=1;
                    if(s-target<min_diff) 
                    {
                        min_diff=s-target;
                        ans=s;
                    }
                 }
                else 
                {
                    l+=1;
                    if(target-s<min_diff) 
                    {
                        min_diff=target-s;
                        ans=s;
                    }
                }
            }
        }
        return ans;
    }
};

C语言

int cmp(const void *a,const void *b)
{
    return *(int*)a-*(int*)b;
}
int threeSumClosest(int* nums, int numsSize, int target) 
{
    qsort(nums,numsSize,sizeof(int),cmp);
    int ans=0;
    int min_diff=1e7;
    for(int i=0;i<numsSize-2;i++)
    {
        int tmp=nums[i];
        int l=i+1;
        int r=numsSize-1;
        while(l<r)
        {
            int s=tmp+nums[l]+nums[r];
            if(s==target) return s;
            else if(s>target) r--;
            else l++;

            if(abs(s-target)<min_diff)
            {
                ans=s;
                min_diff=abs(target-s);
            }
        }
    }
    return ans;
}

  • 15
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值