一、问题描述
给定一个包括 n 个整数的数组 nums
和 一个目标值 target
。找出 nums
中的三个整数,使得它们的和与 target
最接近。返回这三个数的和。假定每组输入只存在唯一答案。
例如,给定数组 nums = [-1,2,1,-4], 和 target = 1. 与 target 最接近的三个数的和为 2. (-1 + 2 + 1 = 2).
二、代码和思路
1.首先定义一个closest_sum来表示最接近flag的值,以及distance来表示与flag差值的绝对值(初值设为无穷大)
2.这里设置一个标志flag来减少代码的余弦冗余,当num[i]大于targe而且flag为1则表示closest_sum已经被更新过
3.遍历排序后的nums,分别从当前位置,当前位置的下一位置为left,最后位置n-1为right来遍历,cur_sum>taget则right左移,否则left右移
这题的思路与leetcode- 15.三数之和相似
class Solution:
def threeSumClosest(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: int
"""
nums.sort()
n=len(nums)
flag=0
closest_sum=0
distance=float("inf")
for i in range(n-2):
if nums[i]>target and flag:
break
if i !=0 and nums[i]==nums[i-1]:continue
left=i+1;right=n-1
while left<right:
cur_sum=nums[i]+nums[left]+nums[right]
cur_distance=abs(cur_sum-target)
if cur_distance<distance:
closest_sum=cur_sum
distance=cur_distance
flag = 1
if cur_sum==target:
break
if cur_sum<target:
left += 1
if cur_sum>target:
right -= 1
return closest_sum