给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。
示例:
输入:nums = [-1,2,1,-4], target = 1
输出:2
解释:与 target 最接近的和是 2 (-1 + 2 + 1 = 2) 。
提示:
3 <= nums.length <= 10^3
-10^3 <= nums[i] <= 10^3
-10^4 <= target <= 10^4
双指针
class Solution(object):
def threeSumClosest(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: int
"""
if len(nums) < 3:
return
nums.sort()
minD = 1<<31
s = None
for i in range(len(nums)-2):
num1 = nums[i]
minDiff = 1<<31
summ = None
start = i + 1
end = len(nums) - 1
while start < end:
tmp = num1 + nums[start] + nums[end]
if abs(tmp-target) < minDiff:
minDiff = abs(tmp-target)
summ = tmp
if tmp > target:
end -= 1
elif tmp < target:
start += 1
else:
break
if minDiff < minD:
minD = minDiff
s = summ
if summ == target:
break
return s
比较直观的方式就是使用双指针来破解双数之和或者三数之和。我们可以先对其进行排序,然后从头开始每次先确定第一个数字,下标为i,然后取两个指针分别指向i+1 和n-1两个数字作为第二个数和第三个数。将它们的和与target进行比对,如果小于target则将左指针右移,如果大于target则将右指针左移,如果等于target则为最优情况,直接可以退出所有循环。时间复杂度:首先进行了一次排序,时间复杂度为O(nlogn),然后最外层遍历O(n),加上内层对剩余数组的扫描O(n),所以最后的时间复杂度为O(n^2)