可以使用排序 + 双指针的方法来高效解决这个问题。具体步骤如下:
- 排序:先对数组
nums
进行排序,这样可以方便使用双指针寻找最接近target
的三数之和。 - 遍历 + 双指针:
- 遍历
nums
,固定第一个数nums[i]
,然后使用双指针方法在i+1
到n-1
范围内寻找剩余的两个数。 - 计算当前三数之和
sum
,与target
进行比较:- 如果
sum == target
,直接返回sum
,因为它已经是最接近的解。 - 如果
sum < target
,说明我们需要更大的值,左指针left
右移。 - 如果
sum > target
,说明我们需要更小的值,右指针right
左移。
- 如果
- 记录当前最接近
target
的三数之和。
- 遍历
代码实现(Python):
def threeSumClosest(nums, target):
nums.sort() # 先排序
closest_sum = float('inf') # 记录最接近的三数之和
for i in range(len(nums) - 2):
left, right = i + 1, len(nums) - 1
while left < right:
curr_sum = nums[i] + nums[left] + nums[right]
# 如果当前和比之前记录的更接近 target,则更新
if abs(curr_sum - target) < abs(closest_sum - target):
closest_sum = curr_sum
if curr_sum < target:
left += 1 # 需要更大的值
elif curr_sum > target:
right -= 1 # 需要更小的值
else:
return curr_sum # 直接返回最优解
return closest_sum # 返回最接近 target 的三数之和
复杂度分析:
- 排序:
O(n log n)
- 遍历 + 双指针:
O(n^2)
(双指针在最坏情况下需要O(n)
) - 总时间复杂度:
O(n^2)
示例:
nums = [-1, 2, 1, -4]
target = 1
print(threeSumClosest(nums, target)) # 输出:2
解释:
- 可能的三数之和:
(-1 + 2 + 1) = 2
,(-1 + 2 + (-4)) = -3
,等 - 最接近
target = 1
的和是2
,因此返回2
。