Letcode数组题:16.最接近的三数之和

最接近的三数之和

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

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

与 target 最接近的三个数的和为 2. (-1 + 2 + 1 = 2).

解法:排序+双指针

算法流程:
1.特判,判断给定数组是否存在或者是数组长度否超过3,如果没有,返回None。
2.对数组进行排序,并定义closest,保存最接近和。
3.遍历排序后数组:
一.对于重复元素,跳过,避免重复计算,可以减少运行时间(也可以不跳过)。
二.令左指针 i = k + 1,右指针 j = len(nums) -1 时,执行循环;

  • s = nums[k] + nums[i] +nums[j],如果s的值与target相等,那么直接返回s
  • 如果s与target差的绝对值小于closest与target差的值,说明closest不是最接近的值,因此更新closest = s
  • 如果s与target的差值小于0,则左指针i加1
  • 如果s与target的差值大于0,则右指针j减一

复杂度分析

在这里插入图片描述

代码如下:

class Solution(object):
    def threeSumClosest(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: int
        """
        if len(nums) < 3 or not nums:
            return None
        closest = float("inf")
        nums.sort()
        for k in range(len(nums)-1):
            if(k>0 and nums[k]==nums[k-1]):
                continue
            i = k + 1
            j = len(nums) - 1
            while(i<j):
                s = nums[k] + nums[i] +nums[j]
                if s == target:
                    return s
                if abs(s-target) < abs(closest-target):
                    closest = s
                if s-target < 0:
                    i += 1
                else:
                    j -= 1
        return closest
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值