LeetCode中C++二分查找函数return语句失效问题排查
问题分析与解决
首先明确:你的return语句是正常生效的。在测试用例[-1,0,3,5,9,12]中找到目标值9后,函数会立刻返回,不会继续执行。你看到的“找到目标后仍继续运行”,是LeetCode的输出缓冲机制导致——cout的输出会先存在缓冲区,直到程序结束才批量打印,造成了函数还在运行的错觉。
真正导致超时的是你的二分查找逻辑存在致命错误,在部分场景下会进入死循环:
- 当
mid为1时,mid / 2等于0(整数除法特性),此时如果需要调整mid(比如目标值小于nums[mid]),mid -= 0不会改变mid的值,循环条件永远满足,程序无限运行直到超时。
修正后的代码
正确的二分查找需要维护左、右边界,通过调整边界来缩小查找范围,确保每次循环都能将范围减半:
class Solution { public: int search(vector<int>& nums, int target) { int left = 0; int right = nums.size() - 1; // 当左边界不超过右边界时,继续查找 while (left <= right) { // 计算中间位置,用left + (right-left)/2避免left+right溢出 int mid = left + (right - left) / 2; if (nums[mid] == target) { return mid; } else if (target > nums[mid]) { // 目标在右半区,将左边界移到mid右侧 left = mid + 1; } else { // 目标在左半区,将右边界移到mid左侧 right = mid - 1; } } // 未找到目标值 return -1; } };
逻辑说明
- 原代码直接修改
mid的方式无法稳定缩小查找范围,容易出现死循环或跳过目标值的情况。 - 维护
left和right边界的方式,能确保每次循环都把查找范围缩小一半,时间复杂度稳定为O(log n),不会出现无限循环的问题。
内容的提问来源于stack exchange,提问作者Garik Mkrtchyan
相关产品推荐
相关产品推荐

