返回

剑指 LeetCode 16:最接近的三数之和

前端

前言

欢迎来到「算法练习系列」的第26期,在这篇文章中,我们将共同学习如何解决LeetCode 16题——最接近的三数之和。

题目

题目: 最接近的三数之和

给定一个包含 n 个整数的数组 nums,和一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个整数的和。

示例:

输入:nums = [-1, 2, 1, -4], target = 1
输出:2
解释:与 target 最接近的和是 2 (-1 + 2 + 1 = 2)。

算法步骤

  1. 排序数组: 将数组 nums 按从小到大排序。
  2. 初始化三个指针: left、right 和 mid。将 left 指向数组的第一个元素,right 指向数组的最后一个元素,mid 指向数组的中间元素。
  3. 计算当前三个指针指向的元素的和: sum = nums[left] + nums[mid] + nums[right]。
  4. 比较 sum 和 target 的差值:
    • 如果 sum 等于 target,则返回 sum。
    • 如果 sum 大于 target,则将 right 指针向左移动一位。
    • 如果 sum 小于 target,则将 left 指针向右移动一位。
  5. 重复步骤 3 和 4, 直到 left 指针和 right 指针相遇。
  6. 保存当前最接近 target 的和: 记录每一次计算出的 sum,并将与 target 差值最小的 sum 保存下来。
  7. 返回保存的和: 返回与 target 差值最小的 sum。

示例代码

def threeSumClosest(nums, target):
    """
    :type nums: List[int]
    :type target: int
    :rtype: int
    """
    # 排序数组
    nums.sort()

    # 初始化三个指针
    left = 0
    right = len(nums) - 1
    mid = (left + right) // 2

    # 初始化最小差值和最接近的目标值
    min_diff = float('inf')
    closest_sum = 0

    # 循环遍历数组
    while left < right:
        # 计算当前三个指针指向的元素的和
        sum = nums[left] + nums[mid] + nums[right]

        # 比较 sum 和 target 的差值
        diff = abs(sum - target)
        if diff == 0:
            # 如果 sum 等于 target,则返回 sum
            return sum
        elif diff < min_diff:
            # 如果 sum 与 target 的差值小于最小差值,则更新最小差值和最接近的目标值
            min_diff = diff
            closest_sum = sum
        if sum > target:
            # 如果 sum 大于 target,则将 right 指针向左移动一位
            right -= 1
        else:
            # 如果 sum 小于 target,则将 left 指针向右移动一位
            left += 1

    # 返回最接近的目标值
    return closest_sum

结论

通过这篇「算法练习系列」文章,我们共同学习了如何解决LeetCode 16题——最接近的三数之和。我们从算法步骤入手,一步步分析了解决问题的思路,并通过示例代码展示了算法的实现过程。希望通过这篇文章,您能够更好地理解算法的本质,并在未来的算法学习中取得更大的进步。