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
发布了7 篇原创文章 · 获赞 0 · 访问量 629

猜你喜欢

转载自blog.csdn.net/qq_36506038/article/details/105399002