📜  排序数组中的地板(1)

📅  最后修改于: 2023-12-03 15:10:10.309000             🧑  作者: Mango

排序数组中的地板

在一个有序数组中,给定一个目标值,找到这个目标值在数组中的下标,如果目标值不存在于数组中,则返回离它最近的较小数字的下标。

这个问题其实可以用二分搜索法来解决。具体来说,我们可以找到离目标值最近的两个数字,它们分别是数组中的第k-1个数字和第k个数字(如果存在目标值,则第k个数字就是目标值)。然后我们返回第k-1个数字的下标即可。

def floor_index(nums, target):
    left, right = 0, len(nums) - 1
    
    while left <= right:
        mid = (left + right) // 2
        if nums[mid] == target:
            return mid
        elif nums[mid] < target:
            left = mid + 1
        else:
            right = mid - 1
    
    # left和right最终停留在方案2和方案3之间,我们选择方案2
    return right

# 测试
print(floor_index([1, 3, 5, 7, 9], 6))  # 2
print(floor_index([1, 3, 5, 7, 9], 10)) # 4

这里我们假设数组是升序排列的,因为题目中没有这方面的限制。这个算法的时间复杂度是O(logN),其中N是数组的长度。