给定一个包括 n 个整数的数组 nums
和 一个目标值 target
。找出 nums
中的三个整数,使得它们的和与 target
最接近。返回这三个数的和。假定每组输入只存在唯一答案。
例如,给定数组 nums = [-1,2,1,-4], 和 target = 1.
与 target 最接近的三个数的和为 2. (-1 + 2 + 1 = 2).
思路:
- 排序
- 遍历外层 0 => len(i) - 2
- 内层双指针法
时间复杂度:O(n^2)
class Solution(object):
def threeSumClosest(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: int
"""
nums.sort()
res = float('inf')
for i in range(len(nums)-2):
l,r = i + 1,len(nums) - 1
while l < r:
sum = nums[i] + nums[l] + nums[r]
if sum == target:return target
elif sum > target:r -= 1
else:l += 1
if abs(sum - target) < abs(res - target):res = sum
return res
排第一的大佬写法:
class Solution(object):
def threeSumClosest(self, nums, target):
nums.sort()
n1=0
ans=0
dif=2**30
lens=len(nums)
while n1<lens-2:
if nums[n1]==nums[n1-1] and n1>0:
n1+=1
continue
n2=n1+1
n3=lens-1
tar=target-nums[n1]
minx=nums[n2]+nums[n2+1]+nums[n1]
if minx>target:
if dif>minx-target:
dif=minx-target
ans=minx
break
maxx=nums[n1]+nums[n3]+nums[n3-1]
if maxx<target:
if dif>target-maxx:
dif=target-maxx
ans=maxx
n1+=1
continue
while n2<n3:
temp=nums[n2]+nums[n3]
d=abs(tar-temp)
if d==0:
return target
if dif>d:
dif=d
ans=temp+nums[n1]
if temp<tar:
n2+=1
else:
n3-=1
n1+=1
return ans