问题概述
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
解法 1:线性搜索
工作原理
线性遍历数组,直到找到目标值或大于目标值的元素:
python
class Solution:
def searchInsert(self, nums, target):
for i in range(len(nums)):
if nums[i] >= target:
return i
return len(nums)
复杂度分析
- 时间复杂度: O(n) - 最坏情况需要扫描整个数组
- 空间复杂度: O(1) - 只使用常数额外空间
何时使用
- 简单易懂
- 适用于小数组
- 对于大数组不是最优解,需要 O(log n) 复杂度
解法 2:二分搜索(最优)
工作原理
使用二分搜索查找目标值或确定插入位置。当循环退出时,left 指向插入位置:
python
class Solution:
def searchInsert(self, nums, target):
left = 0
right = len(nums) - 1
while left <= right:
mid = left + (right - left) // 2
if nums[mid] == target:
return mid
elif nums[mid] < target:
left = mid + 1
else:
right = mid - 1
return left
复杂度分析
- 时间复杂度: O(log n) - 每次迭代将搜索空间减半
- 空间复杂度: O(1) - 只使用常数额外空间
何时使用
- 推荐 - 排序数组的最优解
- 满足 O(log n) 时间复杂度要求
- 对于大数组显著更快
对比
| 方法 | 时间 | 空间 | 最佳适用 |
|---|---|---|---|
| 线性搜索 | O(n) | O(1) | 小数组,简单实现 |
| 二分搜索 | O(log n) | O(1) | 大数组,最优解 |
总结
二分搜索是此问题的最优解,因为数组已排序。它通过每次迭代将搜索空间减半来实现 O(log n) 时间复杂度。当二分搜索循环未找到目标值而退出时,left 自然指向正确的插入位置。