[英]Implementing binary search to find index?
所以我从概念上理解二分搜索是如何工作的,但是在尝试在数组中查找索引时,我总是在实现它时遇到问题。 例如,对于 LC 上的搜索插入位置,我是这样写的:
def searchInsert(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: int
"""
if target > nums[-1]:
return len(nums)
low = 0
high = len(nums) - 1
while high > low:
mid = (low + high) // 2
if nums[mid] == target:
return mid
elif nums[mid] > target:
high = mid
else:
low = mid + 1
return low
它有效,但我不明白为什么我必须将低更新为中 + 1 而不是将低更新为中。 同样,为什么我将高更新为中而不是中 - 1。我尝试更新低/高,因为中、中 - 1 和中 + 1 的每个组合都是唯一有效的组合,但我没有为什么。
在对这些类型的问题实施二分搜索时,有没有办法通过更新低/高值的方式进行推理?
这是个人最喜欢的:
while high >= low:
mid = (low + high) // 2
if nums[mid] >= target:
high = mid - 1
else:
low = mid + 1
return low
# or return nums[low] == target for boolean
它在具有相同值的情况下有所不同。
例如,让我们假设数组是[1,1,2,2,3,3,3,3,4]
。
使用您的函数, search(arr, 1)
返回1
但search(arr, 2)
返回2
。
为什么它在间隔1
s 上返回了最右侧的索引,并在2
秒内返回了最左侧的索引?
我认为,关键在于if nums[mid] >= target:
。
当它找到完全相同的目标时,范围会改变high = mid - 1
。 这意味着high
可能不是答案,因为我们找到的答案是mid
。 [1]
在二分查找的最后一步,范围将接近于零。 最后循环中断他们越过。 因此,答案必须是low
或high
。 但我们知道high
不是 [1] 的答案。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.