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)
逻辑解释
- 排序数组:排序后可以通过移动指针快速调整三数之和的大小,避免暴力枚举所有三元组。
- 固定第一个数:遍历每个元素作为三元组的第一个数,索引范围到
n-3,确保后面还有至少两个元素可以组成三元组。 - 双指针移动:对于每个固定的第一个数,用左、右指针在剩余区间内移动:
- 当前和小于目标值时,左指针右移,增大总和;
- 当前和大于目标值时,右指针左移,减小总和;
- 每次计算都对比当前和与目标的距离,更新最接近的结果。
内容的提问来源于stack exchange,提问作者Jafes
相关产品推荐
相关产品推荐

