LeetCode33题代码疑问:为何while循环中return未退出函数?
问题分析与修复
首先明确:return mid语句执行后会立即终止整个search函数,不可能出现“打印日志后循环仍继续执行”的情况。你观察到的异常现象,本质是代码其他部分的错误引发的(比如数组越界、无限循环卡死),而非return语句失效。
代码中的核心错误
1. 寻找旋转点的循环无限卡死
原代码判断旋转点的逻辑错误,当数组长度为2且旋转过(如[3,1]),循环会无限执行:
- 初始
low=0,high=1,mid=0 - 因
nums[low] > nums[high],设置low=mid=0,此时low < high仍成立,循环重复执行,永远到不了后续的二分查找步骤。
修复方式:调整旋转点判断逻辑,通过比较nums[mid]和nums[high]来定位旋转点:
while (low < high) { mid = low + (high - low) / 2 if (nums[mid] > nums[high]) { // 旋转点在右半部分,缩小左边界 low = mid + 1 } else { // 旋转点在左半部分或当前mid就是旋转点,缩小右边界 high = mid } } val pivot = low // 循环结束后low==high,即为旋转点索引
2. 区间判断触发数组越界
当数组未旋转时,旋转点pivot=0,原代码中target <= nums[mid - 1]会访问nums[-1],直接触发数组索引越界异常,导致程序崩溃。
修复方式:基于旋转点pivot调整区间判断逻辑,避免越界:
low = 0 high = nums.size - 1 if (pivot != 0) { if (target >= nums[0] && target <= nums[pivot - 1]) { // 目标在左半升序区间 high = pivot - 1 } else { // 目标在右半升序区间 low = pivot } } // 若pivot=0,数组未旋转,直接在整个数组查找
3. 二分查找阶段的边界更新错误
原代码中当target > nums[mid]时设置low=mid,会导致当low和high相邻时无法收敛,进入无限循环(如low=2、high=3,mid=2,target大于nums[2]时,low始终为2,循环无法结束)。
修复方式:将low=mid改为low=mid+1,确保边界能正确收敛:
while (low <= high) { mid = low + (high - low) / 2 if (nums[mid] == target) { println("LALALALA") return mid } if (target < nums[mid]) { high = mid - 1 } else { low = mid + 1 // 修正此处 } }
完整修复代码
class Solution { fun search(nums: IntArray, target: Int): Int { if (nums.isEmpty()) return -1 var low = 0 var high = nums.size - 1 var mid = 0 // 寻找旋转点pivot while (low < high) { mid = low + (high - low) / 2 if (nums[mid] > nums[high]) { low = mid + 1 } else { high = mid } } val pivot = low // 确定目标所在区间 low = 0 high = nums.size - 1 if (pivot != 0) { if (target >= nums[0] && target <= nums[pivot - 1]) { high = pivot - 1 } else { low = pivot } } // 二分查找目标 while (low <= high) { mid = low + (high - low) / 2 if (nums[mid] == target) { println("LALALALA") return mid } if (target < nums[mid]) { high = mid - 1 } else { low = mid + 1 } } return -1 } }
内容的提问来源于stack exchange,提问作者user3826764
相关产品推荐
相关产品推荐

