16. 最接近的三数之和

发布时间:2024年01月15日

引流:五点钟科技-CSDN博客?

题目:

给你一个长度为?n?的整数数组?nums?和 一个目标值?target。请你从?nums?中选出三个整数,使它们的和与?target?最接近。

返回这三个数的和。

假定每组输入只存在恰好一个解。

【解题思路】

遇到这种x数之和的问题,不要纠结,优先考虑多指针的解法。本题和【三数之和?】并没有本质上的区别,唯一的区别在于其判断条件变了,这里是要在数组中寻找3个数之和与某个数的距离,在三数之和的题中,是寻找三个数与0之间的关系,很明显的,当target为0时,题目就蜕变成三数之和的问题了,只不过此处是求最“接近”而非“等于”。

既然如此,我们只需要在三数之和的判断条件中,将if的左边项减去一个target,右边仍然保持为0,形式上就还是三数之和的“三段式判别法”,即<0的情况、>0的情况以及=0的情况,这是在判断什么呢?当然是判断第二个指针和第三个指针如何移动的问题啦,显然,当三数之和与target的差值为负数时,说明差值过大,所以第二个指针需要往大的方向移动(向右移动),当三数之和与target的差值为正数时,同理需要第三个指针向左移动,当差值为0时,两个指针同时向内移动一步。那么“最接近”该怎么判断呢?也很好理解,既然是最接近,那必然是求距离的问题,要求最小距离,我们设置一个变量minx来始终记录距离最小的值,因此我们只需要在三段式判别之下再多一个判断,即判断当前三数之和与target之差的绝对值是否小于minx即可,显然,当当三数之和与target的差值为0时,说明三数之和直接等于target,距离达到最小,为0,那么minx就为0。

【代码】

def threeSumClosest(self, nums: List[int], target: int) -> int:
        if len(nums) == 3:
            return sum(nums)
        n = len(nums)-1
        minx = float('inf')
        nums.sort()
        for cur in range(n-1):
            left = cur + 1
            right = n
            while left < right:
                if nums[cur] + nums[left] + nums[right] - target < 0:
                    if abs(nums[cur] + nums[left] + nums[right] - target) < minx:
                        minx = abs(nums[cur] + nums[left] + nums[right] - target)
                        res = nums[cur] + nums[left] + nums[right]
                    left += 1
                elif nums[cur] + nums[left] + nums[right] - target == 0:
                    minx = 0
                    res = nums[cur] + nums[left] + nums[right]
                    left += 1
                    right -= 1
                else:
                    if abs(nums[cur] + nums[left] + nums[right] - target) < minx:
                        minx = abs(nums[cur] + nums[left] + nums[right] - target)
                        res = nums[cur] + nums[left] + nums[right]
                    right -= 1
        return res

?

文章来源:https://blog.csdn.net/qq_36583400/article/details/135595906
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。