最接近的三数之和
题目:给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。
例如,给定数组 nums = [-1,2,1,-4], 和 target = 1.
与 target 最接近的三个数的和为 2. (-1 + 2 + 1 = 2).
解法:排序+双指针
算法流程:
1.特判,判断给定数组是否存在或者是数组长度否超过3,如果没有,返回None。
2.对数组进行排序,并定义closest,保存最接近和。
3.遍历排序后数组:
一.对于重复元素,跳过,避免重复计算,可以减少运行时间(也可以不跳过)。
二.令左指针 i = k + 1,右指针 j = len(nums) -1 时,执行循环;
- 令 s = nums[k] + nums[i] +nums[j],如果s的值与target相等,那么直接返回s
- 如果s与target差的绝对值小于closest与target差的值,说明closest不是最接近的值,因此更新closest = s
- 如果s与target的差值小于0,则左指针i加1
- 如果s与target的差值大于0,则右指针j减一
复杂度分析
代码如下:
class Solution(object):
def threeSumClosest(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: int
"""
if len(nums) < 3 or not nums:
return None
closest = float("inf")
nums.sort()
for k in range(len(nums)-1):
if(k>0 and nums[k]==nums[k-1]):
continue
i = k + 1
j = len(nums) - 1
while(i<j):
s = nums[k] + nums[i] +nums[j]
if s == target:
return s
if abs(s-target) < abs(closest-target):
closest = s
if s-target < 0:
i += 1
else:
j -= 1
return closest