📜  门| GATE-CS-2014-(Set-2) |第 41 题(1)

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

题目描述

给定一个已排序的整数数组和一个目标值,如果在数组中找到目标值,则返回其索引。如果不存在,则返回将目标插入以保持顺序的索引的索引。

函数签名
def search_insert(nums: List[int], target: int) -> int:
    pass
输入
  • nums:已排序的整数数组
  • target:目标值
输出
  • 如果在数组中找到目标值,则返回其索引。
  • 如果不存在,则返回将目标插入以保持顺序的索引的索引。
示例
assert search_insert([1, 3, 5, 6], 5) == 2
assert search_insert([1, 3, 5, 6], 2) == 1
assert search_insert([1, 3, 5, 6], 7) == 4
assert search_insert([1, 3, 5, 6], 0) == 0
解法

这道题可以用二分查找法来解决。因为数组已经排序,所以我们可以根据目标值和数组中间的值的大小关系来逐渐缩小查找的范围,直到找到目标值或者范围缩小到只包含一个元素为止。

一开始,搜索范围为整个数组。将左右指针分别指向数组的首尾元素,找到中间位置的元素,查看中间位置元素和目标元素的大小关系。

如果中间位置元素等于目标元素,则直接返回中间位置;

如果中间位置元素小于目标元素,则说明目标元素在右半部分,将左指针移动到中间位置的右边,并进入下一轮搜索;

如果中间位置元素大于目标元素,则说明目标元素在左半部分,将右指针移动到中间位置的左边,并进入下一轮搜索。

不断重复这个过程,搜索范围逐渐缩小,直到找到目标元素或者范围缩小到只包含一个元素为止。如果范围缩小到只包含一个元素,并且该元素小于目标元素,则说明目标元素应该插入到该元素的右侧,如果该元素大于目标元素,则说明目标元素应该插入到该元素的左侧。

最后返回对应的下标即可。

代码实现
from typing import List

def search_insert(nums: List[int], target: int) -> int:
    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
    return left