二进制搜索重复项,如果未找到目标 return 第一个较大元素的位置

Binary Search with duplicates, if target is not found return the position the first larger element

我想编写一个搜索算法,return确定目标值在排序数组中的位置。 如果目标重复,return 第一个目标的位置。 如果目标不在输入数组中,return数组中最近的较大元素的位置。

例如:

A = [1,2,3,3,6,7,8]

如果 target = 4 输出应该 return 4(元素 6 的位置),因为 4 不在数组中,而 6 是最近的较大数字。

if target = 3 输出应该是 2(数组中前 3 个的位置。

这是我最初的解决方案,但当目标不在数组中时它会失败

def BinSearch(A, target):
    low = 0
    high = len(A)-1
    
    while low <= high:
        mid = (low + high)//2
        
        if A[mid] < target:
            low = mid +1
        elif A[mid] > target:
            high = mid -1
        else:
            if mid - 1 < 0:
                return mid
            if A[mid-1] != target:
                return mid
            high = mid - 1


A = [1,2,3,3,6,7,8]
target = 4
BinSearch(A, target) 
#It returns none, but I expect 4 as output 

对于目标不在数组中的情况,循环的最后一步(其中 low == high)可以收敛于小于目标的值(在 2 in [2,4] 当目标为 3 时),或直接较大的值(在上一个示例中为 4)。

您可以使用临时变量来跟踪 mid 的最后一个值,其中 A[mid] > target

def BinSearch(A, target):
    low = 0
    high = len(A)-1
    ans = None
    
    while low <= high:
        mid = (low + high)//2
        
        if A[mid] < target:
            low = mid +1
        elif A[mid] > target:
            high = mid -1
            ans = mid # since mid is outside the outer limit of the new search space
        else:
            if mid - 1 < 0:
                return mid
            if A[mid-1] != target:
                return mid
            high = mid - 1
    return ans

A = [1,2,3,3,6,7,8]
print(BinSearch(A, 3)) # 2
print(BinSearch(A, 4)) # 4

如果目标大于数组中的所有元素,这将 return None