题目:最接近的三数之和
给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。
例如,给定数组
nums = [-1,2,1,-4]
, 和target = 1
.
与 target 最接近的三个数的和为 2. (-1 + 2 + 1 = 2).
初步尝试:
class Solution:
def threeSumClosest(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: int
"""
l = []
L = []
nums_l = len(nums)
for a in range(nums_l):
for b in range(nums_l):
for c in range(nums_l):
if (a!=b) and (a!=c) and (b!=c):
result = (nums[a] + nums[b] + nums[c] - target)
l.append(result)
for i in l:
i = abs(i)
L.append(i)
MIN = L.index(min(L))
return l[MIN]+target
算法是没什么毛病,但是这几个循环下来,太慢了。
其他思路:
一开始对列表进行排序,按照顺序取数,然后取第二个数和最后一个数。将三数之和和目标值进行比较,相同就直接输出。如果目标值大于三数之和,由于是顺序列表,最后一个数向前进一位进行比较,如果目标值小于三数之和,第二个数前进一位。这样做的话,只用循环一次就历遍了整个列表。
class Solution:
def threeSumClosest(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: int
"""
nums.sort()
res = sum(nums[:3])
# 设置阈值
m = abs(res - target)
for i in range(len(nums)):
l = i+1
r = len(nums)-1
while l < r:
temp = nums[i] + nums[l] +nums[r]
if abs(temp-target) < m:
res = temp
elif target < temp:
r -=1
else :
l +=1
return res
值得一提的是,如果在一开始就设定好阈值,而不是调用给定数据本身的数设置阈值,官方网站完成测试的速度会快很多。但是在时间复杂度上,两者应该是一样的。具体原因不太清楚。
class Solution:
def threeSumClosest(self, nums, target):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
mindiff = 10000
nums.sort()
res = 0
for i in range(len(nums)):
left = i+1
right = len(nums)-1
while left < right:
sum = nums[left] + nums[right] + nums[i]
diff = abs(target - sum)
if diff < mindiff:
mindiff = diff
res = sum
if target == sum:
return sum
elif sum < target:
left += 1
else:
right -= 1
return res
参考文章:
https://blog.csdn.net/weixin_42304045/article/details/80490107
https://blog.csdn.net/iyuanshuo/article/details/79600106