两数之和问题中代码无法进入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)
问题分析
- 二分逻辑混乱:
BinarySearchWork里用了三个独立的if而非elif,同一循环内会多次修改start和end。比如当lis[midpoint]+pick == target时,前两个if会同时触发:先把end设为midpoint-1,再把start设为midpoint+1,直接让start>end,下一次循环直接退出。 - 索引映射错误:对原数组排序后用排序后的索引返回,但题目要求的是原数组的下标,这会导致返回结果不符合要求。
- 循环退出逻辑错误:当找到的
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
相关产品推荐
相关产品推荐

