方法一:双指针法 这种方法的基本思路是先对数组进行排序,然后使用两个指针分别指向当前元素的下一个和数组末尾。通过计算三个数的和与目标值之间的差值,不断调整指针的位置,直到找到最接近目标值的三数之和。

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是数组的长度。双指针法相对于暴力法具有更好的时间效率,因此推荐使用双指针法来解决这个问题。