返回

人工智能攻克编程难题:LeetCode 16 3Sum Closest 解题策略全解析

前端

题目

LeetCode 16 3Sum Closest 这道难题给定了一个包含 n 个整数的数组 nums 和一个目标值 target。我们需要找出 nums 中的三个整数,使得它们的和与 target 最接近。如果存在多个这样的三元组,则返回它们中的任意一个即可。

解题思路:

这道题目的核心思想在于将数组 nums 中的所有元素进行排序,然后使用双指针法来搜索满足条件的三元组。排序后的数组可以确保我们能够快速找到最接近目标值的三元组。双指针法的具体实现步骤如下:

  1. 将数组 nums 中的元素从小到大排序。
  2. 初始化两个指针 left 和 right,分别指向数组 nums 的第一个元素和最后一个元素。
  3. 计算当前三元组的和 sum,即 nums[left] + nums[right] + nums[mid]。
  4. 如果 sum 等于 target,则返回 sum。
  5. 如果 sum 小于 target,则 left 右移一位。
  6. 如果 sum 大于 target,则 right 左移一位。
  7. 重复步骤 3-6,直到 left 和 right 相遇或越界。
  8. 在整个过程中,记录下与 target 最接近的 sum。
  9. 最后返回记录下来的最接近 target 的 sum。

示例:

给定 nums = [-1, 2, 1, -4] 和 target = 1,我们按照上述步骤进行计算:

  1. 将 nums 排序为 [-4, -1, 1, 2]。
  2. 初始化 left = 0 和 right = 3。
  3. 计算 sum = nums[0] + nums[1] + nums[2] = -4 + (-1) + 1 = -4。
  4. 由于 sum 小于 target,因此 left 右移一位,left = 1。
  5. 计算 sum = nums[1] + nums[2] + nums[3] = (-1) + 1 + 2 = 2。
  6. 由于 sum 大于 target,因此 right 左移一位,right = 2。
  7. 重复步骤 3-6,直到 left 和 right 相遇或越界。
  8. 在整个过程中,记录下与 target 最接近的 sum = 2。
  9. 最后返回 2。

代码片段:

def threeSumClosest(nums, target):
    """
    :type nums: List[int]
    :type target: int
    :rtype: int
    """
    nums.sort()
    closest_sum = float('inf')

    for i in range(len(nums) - 2):
        left, right = i + 1, len(nums) - 1

        while left < right:
            current_sum = nums[i] + nums[left] + nums[right]

            if abs(current_sum - target) < abs(closest_sum - target):
                closest_sum = current_sum

            if current_sum < target:
                left += 1
            else:
                right -= 1

    return closest_sum


nums = [-1, 2, 1, -4]
target = 1
result = threeSumClosest(nums, target)
print(result)  # Output: 2

总结:

LeetCode 16 3Sum Closest 这道难题考察了我们的算法设计和实现能力。通过将数组排序并使用双指针法,我们可以有效地找到与目标值最接近的三元组。这道题目的解决方法具有通用性,可以应用于其他类似的编程难题。