📜  算法测验|搜寻|问题8(1)

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

算法测验 | 搜寻 | 问题8

简介

这是一个用于解决搜索问题的算法。给定一个已排序的数组和一个目标值,如果目标值在数组中则返回其索引,否则返回它将要被插入的位置的索引。 时间复杂度为O(log n),具有较高的效率。

实现

算法实现需要注意的点:

  • 数组有序;
  • 判断目标值在哪个区间内;
  • 缩小区间。

实现代码如下:

def searchInsert(nums: List[int], target: int) -> int:
    left, right = 0, len(nums) - 1
    while left <= right:
        mid = (left + right) // 2
        if nums[mid] < target:
            left = mid + 1
        elif nums[mid] > target:
            right = mid - 1
        else:
            return mid
    return left

代码解析:

  • 定义左右指针left和right,表示左右边界;
  • 当左指针小于等于右指针时,循环执行以下操作:
  • 取中间值,判断中间值与目标值的大小;
    • 如果中间值小于目标值,则目标值在数组右半部分;
    • 如果中间值大于目标值,则目标值在数组左半部分;
    • 如果中间值等于目标值,则返回中间值的下标;
  • 如果循环结束仍未找到目标值,则返回左指针left。
测试

我们可以使用下面的测试用例来测试算法的正确性和效率:

assert searchInsert([1,3,5,6], 5) == 2
assert searchInsert([1,3,5,6], 2) == 1
assert searchInsert([1,3,5,6], 7) == 4
assert searchInsert([1,3,5,6], 0) == 0
总结

这个算法是解决搜索问题很好的选择,时间复杂度为O(log n),具有较高的效率,在实际应用中也有很高的价值。