如何在参数固定的递归二分查找中返回mid的原数组索引?
递归版二分查找获取原数组索引的解决方法
你当前的问题在于每次递归都切割数组,导致丢失了子数组在原数组中的位置信息,而且原函数参数固定不能新增,这里可以用内部辅助递归函数来绕开参数限制,同时保留原数组的索引追踪:
核心思路
不切割原数组,而是通过辅助函数传递当前处理的子数组在原数组中的起始和结束索引,这样所有的mid计算都是基于原数组的索引,自然就能直接返回目标元素的原位置。主函数保持原有参数不变,只负责初始化辅助函数的参数。
修改后的代码
class Solution: def binarysearch(self, arr, n, k): # 内部辅助递归函数,带起始、结束索引参数 def _helper(start, end): if start > end: return -1 mid = (start + end) // 2 if arr[mid] == k: return mid # 直接返回原数组的mid索引 elif k > arr[mid]: # 递归处理右半部分,更新起始索引 return _helper(mid + 1, end) else: # 递归处理左半部分,更新结束索引 return _helper(start, mid - 1) # 主函数调用辅助函数,初始范围是整个数组 return _helper(0, n - 1)
关键逻辑说明
- 辅助函数
_helper专门处理递归逻辑,它的start和end参数代表当前要处理的原数组片段的边界,所有索引计算都基于原数组,不会丢失位置信息。 - 主函数
binarysearch完全保留原有的参数列表,符合题目要求的参数固定限制。 - 递归调用时直接返回辅助函数的结果,确保找到目标后能逐层返回正确的原数组索引,没找到则返回-1。
对你原代码的问题补充
你原来的代码还有两个隐性问题:
- 递归调用后没有
return,比如self.binarysearch(...)调用后没有返回结果,导致即使找到目标也无法传递回上层调用。 - 切割数组会产生额外的内存开销,而且无法关联原数组索引,这也是你遇到的核心问题。
内容的提问来源于stack exchange,提问作者Jeevani 6607
相关产品推荐
相关产品推荐

