链接:
题目:
给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。
例如,给定数组 nums = [-1,2,1,-4], 和 target = 1.
与 target 最接近的三个数的和为 2. (-1 + 2 + 1 = 2).
我的解法:类似3sum(https://blog.csdn.net/u014256231/article/details/83514830 ),固定一个数字,找另外两个数,每次求一下差值,如果变小了,记录一下此时的三数和。最后return最小的时候的三数和。
class Solution:
def threeSumClosest(self, nums, target):
closest = 1000
closesum = 0
nums = sorted(nums)
for i in range(len(nums)-2):
if i>0 and nums[i] == nums[i-1]:
continue
j = i + 1
k = len(nums) - 1
while j<k:
if j-1 != i and nums[j] == nums[j-1]:
j += 1
continue
if nums[i]+nums[j]+nums[k]-target == 0:
closesum = nums[i]+nums[j]+nums[k]
return closesum
elif nums[i]+nums[j]+nums[k]-target < 0:
if abs(nums[i]+nums[j]+nums[k]-target) < closest:
closest = abs(nums[i]+nums[j]+nums[k]-target)
closesum = nums[i]+nums[j]+nums[k]
j += 1
elif nums[i]+nums[j]+nums[k]-target > 0:
if abs(nums[i]+nums[j]+nums[k]-target) < closest:
closest = abs(nums[i]+nums[j]+nums[k]-target)
closesum = nums[i]+nums[j]+nums[k]
k -= 1
return closesum
别人的解法1:
class Solution:
def threeSumClosest(self, nums, target):
nums = sorted(nums)
#res表示最小的三数和
res = sum(nums[:3])
for i in range(len(nums)-2):
j = i + 1
k = len(nums) - 1
while j<k:
temp = nums[i] + nums[j] +nums[k]
#更新res
if abs(res - target) > abs(temp-target):
res = temp
if target < temp:
k-=1
else:
j+=1
return res
看了别人的解法后,对我的解法做优化:80ms,击败83%
class Solution:
def threeSumClosest(self, nums, target):
closesum = sum(nums[:3])
nums = sorted(nums)
for i in range(len(nums)-2):
if i>0 and nums[i] == nums[i-1]:
continue
j = i + 1
k = len(nums) - 1
while j < k:
if j-1 != i and nums[j] == nums[j-1]:
j += 1
continue
temp = nums[i]+nums[j]+nums[k]
if temp-target == 0:
return temp
#把这个if抽出来了
if abs(temp-target) < abs(closesum-target):
closesum = temp
if temp-target < 0:
j += 1
elif temp-target > 0:
k -= 1
return closesum