返回

35. 搜索插入位置 - 趣味题解与满分思路剖析

前端

LeetCode 35. 搜索插入位置

题目

给定一个排序数组和一个目标值,在数组中找到目标值并返回其索引。如果目标值不存在,则返回其应插入的位置。

示例 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 = [], target = 0
输出:0

解决思路

我们可以利用二分查找算法来高效地解决这个问题。二分查找算法是一种快速查找排序数组中元素的方法,它通过不断地将数组一分为二,缩小查找范围,从而快速地找到目标元素。

二分查找算法的关键在于找到数组的中间元素,并与目标元素进行比较。如果中间元素等于目标元素,则返回中间元素的索引。如果中间元素大于目标元素,则目标元素一定在数组的左半部分;反之,目标元素一定在数组的右半部分。通过不断地将数组一分为二,缩小查找范围,最终可以找到目标元素的索引。

具体步骤

  1. 设置左边界 left 为 0,右边界 right 为 nums.length - 1。
  2. 计算中间索引 mid = (left + right) / 2。
  3. 将中间元素 nums[mid] 与目标元素 target 进行比较。
  4. 如果 nums[mid] 等于 target,则返回 mid。
  5. 如果 nums[mid] 大于 target,则将 right 更新为 mid - 1,并继续执行步骤 2。
  6. 如果 nums[mid] 小于 target,则将 left 更新为 mid + 1,并继续执行步骤 2。
  7. 如果 left 大于 right,则说明 target 不存在于数组中,返回 left。

代码示例

def search_insert(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

    return left

复杂度分析

  • 时间复杂度:O(log n),其中 n 为数组的长度。
  • 空间复杂度:O(1),因为我们只需要常数个变量来存储中间索引和边界索引。

参考资料

我希望这篇博客对您有所帮助。如果您有任何问题或建议,请随时给我留言。