最接近的三数之和-排序+双指针

Posted xiao-longxia

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最接近的三数之和-排序+双指针相关的知识,希望对你有一定的参考价值。

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

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

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

处理几数之和流程一般是先将数组进行排序,然后使用双指针左右逼近,外层再循环遍历数组,这样每次就可以得到三个数

本题算法流程:

1.特殊情况,若数组是三个数,直接返回三数之和

2.对数组进行排序

3.遍历排序后的数组:

对于重复元素,跳过,优化执行时间

令左指针left=i+1,右指针Right=n-1,当left<right,执行循环:

     计算nums[i]+nums[left]+nums[right]三数之和,以及和target差值diff

     如果diff的绝对值比mindiff小,则更新mindiff和closestSum

     如果diff==0,直接返回三数之和

    如果diff<0,说明threeSum<target,left指针右移

    如果diff>0,说明threeSum>target,right指针左移

class Solution(object):
    def threeSumClosest(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: int
        """
        # 特判:n=3,返回sum(nums)
        n = len(nums)
        if n == 3:
            return sum(nums)
        # 令最小差的绝对值为无限大
        minDiff = float("inf")
        closestSum = 0
        # nums排序
        nums.sort()
        # 遍历nums
        for i in range(n-2):
            if i > 1 and nums[i] == nums[i-1]:
                continue
            # 双指针
            Left = i + 1
            Right = n - 1
            while Left < Right:
                threeSum = nums[i] + nums[Left] + nums[Right]
                diff = threeSum - target
                # 如果diff的绝对值比minDiff小,那么更新minDiff和closestSum
                if abs(diff) < minDiff:
                    minDiff = abs(diff)
                    closestSum = threeSum
                if diff == 0:
                    # 如果diff为0,直接返回threeSum
                    return closestSum
                elif diff < 0:
                    # 说明threeSum < target,L右移
                    Left += 1
                    while(Left<Right and nums[Left]==nums[Left-1]):#去重
                        Left +=1
                else:
                    # 说明threeSum > target,R左移
                    Right -= 1
                    while(Left<Right and nums[Right]==nums[Right+1]):#去重
                        Right -= 1
        return closestSum

 

以上是关于最接近的三数之和-排序+双指针的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode 16. 最接近的三数之和

最接近的三数之和--力扣

LeetCode 16. 最接近的三数之和

16. 最接近的三数之和(双指针)

16. 最接近的三数之和(双指针)

Leetcode-016-最接近的三数之和