解题思路-leetcode第十六题:最接近的三数之和

解题思路-leetcode第十六题:最接近的三数之和

给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。

例如,给定数组 nums = [-1,2,1,-4], 和 target = 1.

与 target 最接近的三个数的和为 2. (-1 + 2 + 1 = 2).
本题和上一题三数之和很相似,所以采用同样的方法,即先升序排序再利用双指针循环。区别在于,本题是找和最接近目标值的三个数,并返回这个和,所以本题定义了一个无限大浮点数res,用于存储三数之和,在循环体while内也有区别,首先算出当前循环到的三数之和,若此和等于目标值,则返回目标值,若此值与目标值的距离小于上一个循环时的距离,则更新三数之和,若此和小于目标值,则将左指针向右移动,否则右指针向左移动,最后返回存储的三数之和。代码如下:

class Solution:
    def threeSumClosest(self, nums: List[int], target: int) -> int:
        n=len(nums)
        if(not nums or n<3):
            return None
        nums.sort()
        res=float("inf")
        for i in range(n):
            if(i>0 and nums[i]==nums[i-1]):
                continue
            L=i+1
            R=n-1
            while(L<R):
                sum=nums[i]+nums[L]+nums[R]
                if(sum==target):
                    return target
                if(abs(sum-target)<abs(res-target)):
                    res=sum
                if(sum-target<0):
                    L+=1
                else:
                    R-=1
        return res

提交后,通过。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值