题目描述
给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。
例如,给定数组 nums = [-1,2,1,-4], 和 target = 1.
与 target 最接近的三个数的和为 2. (-1 + 2 + 1 = 2).
解法
采用排序 + 双指针的思想。
- 特别情况判定,如果
len(nums) <= 3
,直接返回sum(nums)
- 对
nums
进行升排序。 - 对排序后的数组进行遍历:
1. 对于重复元素:跳过,优化执行时间
2. 令左指针low = i + 1
,右指针high = n - 1
,当 L < R时,执行循环:
(1) 计算nums[i] + nums[low] + nums[high]
三数和,以及与target
的当前差cur_diff
(2) 如果当前差值cur_diff的绝对值小于最小差值,更新最小差值mindiff
,将三个数之和赋予给closesum
(3) 如果cur_diff == 0,绝对是最接近的三数之和,返回。
(4) 如果cur_diff < 0
,low
指针向右移动,遇到重复的就跳过
(5) 如果cur_diff > 0
,high
指针向左移动,遇到重复的就跳过
code如下:
def threeSumClosest(nums, target):
leng = len(nums)
# if leng < 3: return None
if leng <=3: return sum(nums)
# 排序
nums.sort()
k, dur_diff = 0, 0
mindiff = float('inf')
closesum = 0
for k in range(leng):
if k > 1 and nums[k] == nums[k-1]:
continue
low = k+1
high = leng-1
while low < high:
threesum = nums[k] + nums[low] + nums[high]
dur_diff = threesum - target
# 如果当前绝对值小于minddiff,更新最下minddiff
if abs(dur_diff) < mindiff:
mindiff = abs(dur_diff)
closesum = threesum
# 如果相等,直接返回closesum
if dur_diff == 0:
closesum = threesum
return closesum
elif dur_diff < 0:
low += 1
while low<high and nums[low] == nums[low-1]: low += 1
else:
high -= 1
while low< high and nums[high] == nums[high+1]: high-=1
return closesum
测试:
threeSumClosest([1,2,4,8,16,32,64,128],82)
Out:82