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

两数之和问题中代码无法进入while循环的调试求助

两数之和二分查找解法调试问题

我给LeetCode的两数之和问题写了个基于二分查找的解法,但测试用例twoSum([3,2,4],6)时,程序压根没进入while循环——明明满足end>=start的条件(比如start=end=0的情况),找不到问题出在哪,求帮忙。

代码如下:

def BinarySearchWork(lis, target, prick):
    start = 0
    pick = prick[0]
    control = prick[1]
    length = len(lis)
    end = length - 1
    while (end >= start ):
        midpoint = int(((end + start) / 2))
        if lis[midpoint] + pick >= target:
            end = midpoint - 1
        if lis[midpoint] + pick <= target:
            start = midpoint + 1
        if lis[midpoint] + pick == target:
            if midpoint == control:
                continue
            else:
                return (midpoint)
                print(midpoint)
        else:
            return(False)

def twoSum(nums, target):
    """
    :type nums: List[int]
    :type target: int
    :rtype: List[int]
    """
    pick = 0
    nums1 = sorted(nums)
    for i in range(0, len(nums)):
        pick = [nums1[i], i]
        if (BinarySearchWork(nums1, target, pick)):
            return [i, BinarySearchWork(nums1, target, pick)]

twoSum([3,2,4],6)

问题分析

  1. 二分逻辑混乱:BinarySearchWork里用了三个独立的if而非elif,同一循环内会多次修改start和end。比如当lis[midpoint]+pick == target时,前两个if会同时触发:先把end设为midpoint-1,再把start设为midpoint+1,直接让start>end,下一次循环直接退出。
  2. 索引映射错误:对原数组排序后用排序后的索引返回,但题目要求的是原数组的下标,这会导致返回结果不符合要求。
  3. 循环退出逻辑错误:当找到的midpoint等于control时用continue,但此时start和end已经被前面的if修改,后续循环条件不满足直接退出,函数无返回值,导致twoSum里的判断失效。

修复后的代码

def binary_search(lis, target, pick_val, skip_idx):
    start = 0
    end = len(lis) - 1
    while start <= end:
        mid = (start + end) // 2
        current_sum = lis[mid] + pick_val
        if current_sum == target:
            if mid == skip_idx:
                # 跳过当前元素,继续查找
                start = mid + 1
                continue
            return mid
        elif current_sum < target:
            start = mid + 1
        else:
            end = mid - 1
    return -1  # 没找到返回-1

def twoSum(nums, target):
    # 保存原数组元素与对应索引,再排序
    sorted_with_idx = sorted((val, idx) for idx, val in enumerate(nums))
    sorted_vals = [x[0] for x in sorted_with_idx]
    
    for i in range(len(sorted_with_idx)):
        pick_val, original_idx = sorted_with_idx[i]
        res_idx = binary_search(sorted_vals, target, pick_val, i)
        if res_idx != -1:
            # 返回原数组的两个索引
            return [original_idx, sorted_with_idx[res_idx][1]]
    return []

print(twoSum([3,2,4],6))  # 输出 [1,2]

修复说明

  • 把二分里的独立if改成elif,确保每次循环只调整一次start或end,逻辑清晰不冲突。
  • 排序时保留原数组的索引,解决排序后索引映射错误的问题。
  • 当需要跳过当前元素时,主动调整start继续查找,避免循环直接退出。
  • 用-1表示未找到,避免返回None导致判断逻辑出错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 11:55:35