📜  在排序数组中搜索 K 的插入位置(1)

📅  最后修改于: 2023-12-03 14:51:27.224000             🧑  作者: Mango

在排序数组中搜索 K 的插入位置

给定一个升序排列的整数数组 nums 和一个目标值 target,找到 target 在 nums 中的插入位置,使得将target插入到数组中后,数组仍然保持有序。如果数组中已经存在该目标值,则返回它的下标。

示例 1:

输入:nums = [1,3,5,6], target = 5 输出:2

示例 2:

输入:nums = [1,3,5,6], target = 2 输出:1

示例 3:

输入:nums = [1,3,5,6], target = 7 输出:4

示例 4:

输入:nums = [1,3,5,6], target = 0 输出:0

示例 5:

输入:nums = [1], target = 0 输出:0

解题思路

这道题可以使用二分查找的方法,来定位目标值的插入位置。具体步骤如下:

  • 初始化两个指针 left和 right,分别指向数组的左端和右端。
  • 如果目标值小于等于数组的第一个元素,那么它的插入位置就是 0。
  • 如果目标值大于数组的最后一个元素,那么它的插入位置就是数组的长度 len。
  • 使用二分查找的方法,在数组中查找目标值:用 mid 表示left 和 right 中间的位置,每次将数组范围缩小一半。
  • 如果目标值等于 nums[mid],那么插入位置就是 mid。
  • 如果目标值小于 nums[mid],那么要插入的位置在 mid 左边的子数组中,因此将指针 right 更新为 mid-1。
  • 如果目标值大于 nums[mid],那么要插入的位置在 mid 右边的子数组中,因此将指针 left 更新为 mid+1。
  • 指针 left 最终的位置,即为要插入的位置。
代码实现
def searchInsert(nums, target):
    left, right = 0, len(nums) - 1
    
    if target <= nums[0]:
        return 0
    elif target > nums[-1]:
        return len(nums)
    
    while left <= right:
        mid = (left + right) // 2
        if target == nums[mid]:
            return mid
        elif target < nums[mid]:
            right = mid - 1
        else:
            left = mid + 1
    return left
复杂度分析

时间复杂度:$O(log_n)$,其中 n 是数组的长度。二分查找的时间复杂度为 $O(log_n)$。

空间复杂度:$O(1)$,没有使用额外的空间。