含重复元素的旋转数组搜索递归实现输出异常排查求助
嘿,我来帮你排查这个问题!首先看你描述的现象:最后一次递归调用mid=4,x=3等于arr[mid],但程序没触发return mid反而返回了False,大概率是递归终止条件的逻辑或位置出错了,再加上带重复元素的旋转数组本身有特殊情况需要处理,我给你拆解下:
最直接的问题:终止条件逻辑错误
如果你代码里的终止条件写成了类似 if low >= high: return False,那当最后一次递归时low=high=4,程序会直接触发这个条件返回False,完全跳过了x == arr[mid]的判断——这正好匹配你遇到的情况!
正确的终止条件应该是 if low > high: return False(当搜索范围为空时才返回找不到),而且要把这个判断放在函数最开头,这样当low <= high时,程序会先计算mid,再检查是否匹配目标值。
第二个问题:重复元素的特殊处理
带重复元素的旋转数组和普通旋转数组的区别在于:当arr[low] == arr[mid] == arr[high]时,你无法判断左半部分还是右半部分是有序的,这时候如果按普通逻辑走递归,会进入错误的分支,甚至陷入死循环。
修正后的完整代码示例
class rotatedArraySearch: def rotatedAS(self, arr, x, low, high): # 搜索范围为空时返回False if low > high: return False mid = (low + high) // 2 # 用//确保整数索引,Python3也兼容 print(mid) # 找到目标值直接返回索引 if x == arr[mid]: return mid # 处理重复元素:左中右元素相等时,缩小搜索范围 if arr[low] == arr[mid] == arr[high]: return self.rotatedAS(arr, x, low + 1, high - 1) # 判断左半部分是否有序 if arr[low] <= arr[mid]: # 目标值在左半有序区间内,搜索左半 if arr[low] <= x < arr[mid]: return self.rotatedAS(arr, x, low, mid - 1) # 否则搜索右半 else: return self.rotatedAS(arr, x, mid + 1, high) else: # 右半部分有序,判断目标值是否在右半区间 if arr[mid] < x <= arr[high]: return self.rotatedAS(arr, x, mid + 1, high) # 否则搜索左半 else: return self.rotatedAS(arr, x, low, mid - 1)
验证你的场景
假设你的arr2是类似[2,2,3,2,2,2,2,2,2]这样的旋转数组(mid=4对应的元素是3),用修正后的代码测试:
- 最后一次递归时
low=4, high=4,不会触发low>high的终止条件 - 直接检查
x == arr[mid],匹配后返回mid=4,不会走到末尾的False
内容的提问来源于stack exchange,提问作者wAnder
相关产品推荐
相关产品推荐

