Given an array S of n integers, find three integers in S such that the sum is closest to a given number, target. Return the sum of the three integers. You may assume that each input would have exactly one solution.
For example, given array S = {-1 2 1 -4}, and target = 1.
For example, given array S = {-1 2 1 -4}, and target = 1.
The sum that is closest to the target is 2. (-1 + 2 + 1 = 2).
这题的做法和3sum一样只不过把sum=0改成sum变成target,需要设置一个minval来记录每次和target的最小,如果得到的差值小于记录值那么就将sum赋值给result 最后输出。
时间复杂度依然为O(n^2)
This problem is similar to 3 sum, beside use three pointers to track the value of the 3sums we need to use an extra tracker minval to track the difference between the target and the sum. When the the abs(sum-target)<minval we pass abs(sum-target) to minval and pass sum to result. if any of the sum=target we return target, otherwise return result when all the iteration finished.
the time complexity is O(n^2) space O(1)
code as follow:
class Solution:
# @return an integer
def threeSumClosest(self, num, target):
minval=100000
num.sort()
for i in range(len(num)):
#if i>0 and num[i]==num[i-1]:
# continue
left=i+1
right=len(num)-1
while left<right:
val=num[i]+num[left]+num[right]
if abs(val-target)<minval:
minval=abs(val-target)
result=val
if val==target:
return target
if val<=target:
left+=1
else:
right-=1
return result