查找数组旋转次数题中使用<代替<=为何会触发超时?
二分查找超时原因分析
核心死循环触发逻辑
你遇到的TLE本质是边界场景下循环无法收敛,具体触发逻辑如下:
- 当
start和end相邻时(即end = start + 1),mid = start + (end - start)/2的计算结果永远等于start - 此时如果
arr[mid] == arr[start](要么mid就是start本身,要么数组有重复元素),原始判断arr[mid] < arr[start]不成立,会走else分支把start赋值为mid(和原来的start完全一致) - 下一轮循环的
start和end还是原来的相邻状态,mid计算结果也不会变化,永远卡在这个状态无法退出循环,最终导致超时。
具体测试用例复现
举最简单的无旋转递增数组示例:arr = [1,2,3,4,5],预期返回值为0,原始代码运行流程:
- 初始状态:
start=0, end=4,mid=2,arr[2] = 3 > arr[0] = 1,走else分支start = 2 - 第一轮迭代:
start=2, end=4,mid=3,arr[3] =4 > arr[2] =3,走else分支start=3 - 第二轮迭代:
start=3, end=4,mid=3,arr[3] =4等于arr[start] =4,原始条件arr[mid]<arr[start]不成立,走else分支start=3 - 后续迭代永远卡在
start=3, end=4的状态,无法退出循环。
加等号后的逻辑修复
把判断条件改成arr[mid] <= arr[start]后,上述场景下arr[mid] == arr[start]会命中判断,执行end = mid -1 = 2,此时end < start,循环正常退出,返回0符合预期。
同时这个修改也覆盖了数组存在重复元素的场景,不会因为元素相等导致循环无法收敛。
内容的提问来源于stack exchange,提问作者Roy0Anonymous
相关产品推荐
相关产品推荐

