python-leetcode-16. 最接近的三数之和

16. 最接近的三数之和 - 力扣(LeetCode)

可以使用排序 + 双指针的方法来高效解决这个问题。具体步骤如下:

  1. 排序:先对数组 nums 进行排序,这样可以方便使用双指针寻找最接近 target 的三数之和。
  2. 遍历 + 双指针
    • 遍历 nums,固定第一个数 nums[i],然后使用双指针方法在 i+1n-1 范围内寻找剩余的两个数。
    • 计算当前三数之和 sum,与 target 进行比较:
      • 如果 sum == target,直接返回 sum,因为它已经是最接近的解。
      • 如果 sum < target,说明我们需要更大的值,左指针 left 右移。
      • 如果 sum > target,说明我们需要更小的值,右指针 right 左移。
    • 记录当前最接近 target 的三数之和。

代码实现(Python):

def threeSumClosest(nums, target):
    nums.sort()  # 先排序
    closest_sum = float('inf')  # 记录最接近的三数之和

    for i in range(len(nums) - 2):
        left, right = i + 1, len(nums) - 1
        while left < right:
            curr_sum = nums[i] + nums[left] + nums[right]
            # 如果当前和比之前记录的更接近 target,则更新
            if abs(curr_sum - target) < abs(closest_sum - target):
                closest_sum = curr_sum
            
            if curr_sum < target:
                left += 1  # 需要更大的值
            elif curr_sum > target:
                right -= 1  # 需要更小的值
            else:
                return curr_sum  # 直接返回最优解
    
    return closest_sum  # 返回最接近 target 的三数之和

复杂度分析

  • 排序O(n log n)
  • 遍历 + 双指针O(n^2)(双指针在最坏情况下需要 O(n)
  • 总时间复杂度O(n^2)

示例

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

解释

  • 可能的三数之和:(-1 + 2 + 1) = 2(-1 + 2 + (-4)) = -3,等
  • 最接近 target = 1 的和是 2,因此返回 2
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值