繁体   English   中英

实现二分搜索来查找索引?

[英]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)返回1search(arr, 2)返回2

为什么它在间隔1 s 上返回了最右侧的索引,并在2秒内返回了最左侧的索引?

我认为,关键在于if nums[mid] >= target:

当它找到完全相同的目标时,范围会改变high = mid - 1 这意味着high可能不是答案,因为我们找到的答案是mid [1]

在二分查找的最后一步,范围将接近于零。 最后循环中断他们越过。 因此,答案必须是lowhigh 但我们知道high不是 [1] 的答案。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM