题目描述
给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。
例如,给定数组 nums = [-1,2,1,-4], 和 target = 1.
与 target 最接近的三个数的和为 2. (-1 + 2 + 1 = 2).
方法一 暴力法
这个方法是我最开始就想到的,也是我沿用了我的另一篇博客:三数之和里面的思路:利用for循环嵌套的方法求出三数之和,然后与目标数target做差,最后找到最小差。这个方法简单,暴力,但是消耗的时间比较高。
代码段
def threeSumClosest(nums, target):
l = len(nums)
tl1 = []
tl2 = []
for i in range(l-2):
for j in range(i+1,l-1):
for k in range(j+1,l):
b1 = nums[i]
b2 = nums[j]
b3 = nums[k]
a = b1+b2+b3
tl1.append(a-target)
tl2.append(abs(a-target))
tl2.sort()
close = tl2[0]
if close in tl1:
return close+target
if -close in tl1:
return -close+target
方法二
这个方法是我百度借鉴网上大佬们的方法(参考网址:https://blog.csdn.net/chenhua1125/article/details/80545116) 然后自己试着写了一遍,果然执行速度要比方法一快的多
代码段
def threeSumClosest(nums, target):
nums.sort()
l = len(nums)
mindiff = 1000000
outsums = 0
for i in range(l-2):
j = i+1
k = l-1
while j<k:
sums = nums[i]+nums[j]+nums[k]
cha = abs(sums-target)
if cha == 0:
return sums
if cha<mindiff:
mindiff = cha
outsums = sums
if sums > target:
k -= 1
elif sums < target:
j += 1
return outsums