方法一:双指针法 这种方法的基本思路是先对数组进行排序,然后使用两个指针分别指向当前元素的下一个和数组末尾。通过计算三个数的和与目标值之间的差值,不断调整指针的位置,直到找到最接近目标值的三数之和。
def threeSumClosest(nums, target):
nums.sort() # 对数组进行排序
n = len(nums)
closest_sum = float('inf') # 初始化最接近的三数之和
for i in range(n):
left = i + 1 # 左指针
right = n - 1 # 右指针
while left < right:
total = nums[i] + nums[left] + nums[right] # 当前三数之和
if abs(total - target) < abs(closest_sum - target): # 更新最接近的三数之和
closest_sum = total
if total == target: # 如果找到等于目标值的三数之和,直接返回
return target
elif total < target:
left += 1 # 和小于目标值,左指针右移
else:
right -= 1 # 和大于目标值,右指针左移
return closest_sum
方法二:暴力法 这种方法的思路比较简单,即通过三重循环枚举所有可能的三元组,计算它们的和与目标值之间的差值,并不断更新最接近的三数之和。
def threeSumClosest(nums, target):
n = len(nums)
closest_sum = float('inf') # 初始化最接近的三数之和
for i in range(n - 2):
for j in range(i + 1, n - 1):
for k in range(j + 1, n):
total = nums[i] + nums[j] + nums[k] # 当前三数之和
if abs(total - target) < abs(closest_sum - target): # 更新最接近的三数之和
closest_sum = total
return closest_sum
这两种方法的时间复杂度均为O(n^2),其中n是数组的长度。双指针法相对于暴力法具有更好的时间效率,因此推荐使用双指针法来解决这个问题。