You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python三数之和最接近目标问题:循环逻辑失效求助

三数之和最接近目标值问题的代码错误分析与修正

问题描述

刚学习Python不久,尝试解决给定整数数组寻找三数之和最接近目标值的问题。思路是先排序数组,再使用双指针——一个从数组头部右移,一个从尾部左移,第三个指针遍历整个数组计算三数之和,但代码运行异常,会遗漏部分索引,搞不懂这点就担心无法掌握循环逻辑。

给出的代码:

nums = [0,1,1,1]
target = 100

nums.sort()
pointer_one = 0
pointer_two = len(nums) - 1
result = nums[0] + nums[1] + nums[2]

while pointer_one < pointer_two:
    for i in nums:
        if i == pointer_one or i == pointer_two:
            pass
        else:
            sum_num = nums[i] + nums[pointer_one] + nums[pointer_two]
            how_close = abs(target - sum_num)
            if how_close < abs(target - result):
                result = sum_num
    pointer_one = pointer_one + 1
    pointer_two = pointer_two - 1
print("Result: ", result)

核心错误点

  • 遍历元素而非索引:for i in nums循环的是数组元素值,不是索引。比如示例数组中i会取0、1、1、1,而非0、1、2、3,这直接导致nums[i]访问错误的元素,甚至可能触发索引越界。
  • 指针判断逻辑错误:if i == pointer_one or i == pointer_two是拿元素值和指针索引值对比,完全逻辑混乱。你需要跳过的是索引等于pointer_one或pointer_two的位置,而非元素值等于这些索引。
  • 双指针逻辑误用:你同时移动头尾指针再遍历第三个元素的方式,会大量遗漏有效的三元组。三数之和问题的标准双指针逻辑是固定一个数,再用左右指针在剩余区间内移动,这样才能覆盖所有可能的组合。

修正后的代码

nums = [0,1,1,1]
target = 100

nums.sort()
n = len(nums)
result = nums[0] + nums[1] + nums[2]  # 初始化结果

# 固定第一个数的索引i
for i in range(n - 2):
    left = i + 1  # 左指针从i的下一位开始
    right = n - 1  # 右指针从数组末尾开始
    while left < right:
        current_sum = nums[i] + nums[left] + nums[right]
        # 更新最接近目标的结果
        if abs(target - current_sum) < abs(target - result):
            result = current_sum
        # 根据当前和与目标的关系移动指针
        if current_sum < target:
            left += 1  # 和太小,左指针右移增大和
        else:
            right -= 1  # 和太大,右指针左移减小和

print("Result: ", result)

逻辑解释

  1. 排序数组:排序后可以通过移动指针快速调整三数之和的大小,避免暴力枚举所有三元组。
  2. 固定第一个数:遍历每个元素作为三元组的第一个数,索引范围到n-3,确保后面还有至少两个元素可以组成三元组。
  3. 双指针移动:对于每个固定的第一个数,用左、右指针在剩余区间内移动:
    • 当前和小于目标值时,左指针右移,增大总和;
    • 当前和大于目标值时,右指针左移,减小总和;
    • 每次计算都对比当前和与目标的距离,更新最接近的结果。

内容的提问来源于stack exchange,提问作者Jafes

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 08:45:46