Skip to main content

35.搜索插入位置

标签: array, binary-search

难度: Easy

通过率: 47.81%

原题链接: https://leetcode.com/problems/search-insert-position/description/

题目描述

给定一个排序的整数数组和一个目标值,如果找到目标值则返回其索引。如果没有找到,返回它将被按顺序插入的位置。你必须设计一个时间复杂度为 O(logn)O(\log n) 的算法。

解题思路

因为数组是排序的,我们可以利用二分查找来实现 O(logn)O(\log n) 的时间复杂度。使用二分查找的方法来查找目标值:

  1. 初始化两个指针:leftright,分别指向数组的开始和结尾。
  2. 计算中间位置 mid
  3. 如果 nums[mid] 等于目标值,则直接返回 mid
  4. 如果 nums[mid] 小于目标值,则搜索范围缩小到右半部分,将 left 更新为 mid + 1
  5. 如果 nums[mid] 大于目标值,则搜索范围缩小到左半部分,将 right 更新为 mid - 1
  6. left 超过 right 时退出循环,此时 left 的位置就是目标值应插入的位置。

这一过程利用了数组有序的特性,所以时间复杂度为 O(logn)O(\log n)

代码实现

def searchInsert(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` 是插入位置
return left

复杂度分析

时间复杂度:O(logn)O(\log n),其中 nn 是数组的长度,因为我们使用二分查找。` 空间复杂度:O(1)O(1),只使用了常数级别的额外空间。