该解法采用了双指针的思路,首先将数组排序,然后固定一个元素,利用双指针在剩余的元素中寻找与目标值最接近的两个数。具体步骤如下:
1. 对数组进行排序。
2. 遍历数组,对于每个元素nums[k],在剩余的元素中使用双指针i和j分别指向nums[k+1]和数组末尾。
3. 计算当前三个数的和s,如果s与目标值target的差的绝对值小于当前答案ans与target差的绝对值,则更新ans为s。
4. 如果s等于target,直接返回s;如果s大于target,则将右指针j向左移动;如果s小于target,则将左指针i向右移动。
5. 重复步骤3-4,直到左右指针相遇。
6. 返回最接近目标值的和ans。
时间复杂度: O(n^2)
空间复杂度: O(1)
class Solution:
def threeSumClosest(self, nums: List[int], target: int) -> int:
nums.sort() # 对数组进行排序
ans = nums[0] + nums[1] + nums[2] # 初始化答案为前三个数的和
n = len(nums)
for k in range(n): # 固定一个数,索引为k
i = k + 1 # 左指针指向nums[k+1]
j = n - 1 # 右指针指向数组末尾
while i < j:
s = nums[k] + nums[i] + nums[j] # 计算当前三个数的和
if abs(s-target) < abs(ans-target): # 如果当前和更接近目标值,更新答案
ans = s
if s == target: # 如果当前和等于目标值,直接返回
return s
elif s > target: # 如果当前和大于目标值,将右指针向左移动
j -= 1
elif s < target: # 如果当前和小于目标值,将左指针向右移动
i += 1
return ans # 返回最接近目标值的和