目录
问题
给定一个包括 n 个整数的数组 nums
和 一个目标值 target
。找出 nums
中的三个整数,使得它们的和与 target
最接近。返回这三个数的和。假定每组输入只存在唯一答案。
例如,给定数组 nums = [-1,2,1,-4], 和 target = 1.
与 target 最接近的三个数的和为 2. (-1 + 2 + 1 = 2).
解题思路
分析:题目中有两个关键信息:1)假定每组输入只存在唯一答案;2)三个数的和与 target
最接近,返回这三个数的和。
这个问题的思考和LeetCode15题的三数之和非常类似,解题方法也类同博文:https://blog.csdn.net/weixin_42521211/article/details/88189536。不过这道题相对来说,更简单,因为限制了唯一,并且只需要返回三个数的和。
具体步骤:
1)先对数组进行排序,预设一个差值最小的数targetDiff(2**31-1),一个数组result来存储三个数的下标;
2)第一层循环遍历数组,第二层循环借助双指针遍历思想,如果三数和与target差值等于0,则可以直接返回三数和:target;否则,判断当前的三数之和与target的差值的绝对值与targetDiff比较,让targetDiff保存当前差值最小的数,如果targetDiff值进行了更新,则result也进行更新,存储当前的三个数的下标。
3)返回结果。最后,result记录的即为三个数在nums中的下标,因此取出求和即可。
详细实现代码如下:
python具体实现
class Solution(object):
def threeSumClosest(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: int
"""
numLen = len(nums)
# 特殊情况的处理:数组个数小于3 及 等于 3的情况
if numLen<3:
return 0
#if numLen== 3:
#return sum(nums)
nums.sort() # 数组排序
result = []
targetDiff = 2**31-1 # 初始预设的最大差值
for i in range(numLen):
# 双指针实现
left = i+1
right = numLen-1
while left<right:
temp = nums[i]+nums[left]+nums[right]-target
if temp ==0:
return target
abstemp = abs(temp)
if abstemp<targetDiff:
result = [i,left,right]
targetDiff = abstemp
if temp>0:
right = right-1
else:
left = left+1
return nums[result[0]]+nums[result[1]]+nums[result[2]]
题外记
有了之前“三数之和”的实现经历,完成这道题,就是小菜一碟了吧。(小嘚瑟下)