为何二分搜索代码触发Time Limit Exceeded(TLE),线性搜索却正常?
二分搜索超时问题分析与修复
你的二分搜索代码存在几个关键错误,导致搜索范围无法正确缩小,最终陷入死循环触发TLE:
边界更新逻辑完全搞反:
当nums[m] < target时,目标应该在右半区间,正确操作是把左边界l设为m + 1,而不是修改右边界r;反之,当nums[m] >= target时,目标在左半区间,应该把右边界r设为m - 1,而不是修改左边界l。这是导致搜索范围越缩越乱、最终死循环的核心原因。循环条件错误:
do-while循环先执行再判断条件,你的终止条件(l <= r) && (nums[m] != target)逻辑矛盾——找到target时会终止,但如果没找到,l最终会大于r,但错误的边界更新已经让程序陷入死循环,根本等不到这个判断生效。未处理未找到目标的情况:
如果遍历完数组都没找到target,应该返回-1,而不是直接返回m,否则会返回一个错误的索引。
修复后的代码如下:
int search(int* nums, int numsSize, int target){ int l = 0; int r = numsSize - 1; while (l <= r) { int m = l + (r - l) / 2; // 和你的m计算方式等价,写法更直观 if (nums[m] == target) { return m; } else if (nums[m] < target) { l = m + 1; } else { r = m - 1; } } return -1; // 未找到目标返回-1 }
修复说明:
- 用while循环替代do-while,确保每次循环前先判断搜索范围是否有效
- 正确更新边界:小于target时左移左边界,大于时右移右边界
- 找到目标立即返回,循环结束后返回-1表示未找到
这样修改后,二分搜索就能正常工作,不会出现超时问题,效率也远高于线性搜索。
内容的提问来源于stack exchange,提问作者user20977916
相关产品推荐
相关产品推荐

