力扣(LeetCode) 35: 搜索插入位置 - 解法思路

问题概述

给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。

解法 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 自然指向正确的插入位置。

相关推荐
Fuyo_11191 小时前
C++ 运行时多态与虚函数机制全面剖析【面试重点】
开发语言·c++·面试
w_zero_one1 小时前
递归算法(一)
java·开发语言·算法
IT规划师2 小时前
一文讲透五种发布机制:滚动、蓝绿、金丝雀、红黑与 AB
后端·面试
圣保罗的大教堂2 小时前
leetcode 3736. 最小操作次数使数组元素相等 III 简单
leetcode
文丑颜不良啊2 小时前
LeetCode1881~1990题目解析
java·leetcode
风影同志783243 小时前
20 个比特能装下多少行情?——实测拆解 Kronos 的 K 线分词器
算法
写的都是BUG4 小时前
APK 里的钥匙,一直就放在门口:聊聊加固真正该做什么
前端·算法
lsc_blog4 小时前
年底还在招的岗位,先确认缺口和到岗要求
git·缓存·ci/cd·职场和发展·github
地平线开发者4 小时前
CLIP 的零样本分类:一组文本如何变成图像分类器?
算法
京东云开发者5 小时前
从“会生成”到“能生产”:萤火虫 AIGC 平台的 AI Infra 实践
算法·aigc·产品