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

相关推荐
吃好睡好便好5 小时前
在Matlab中绘制横直方图
开发语言·学习·算法·matlab
仰泳之鹅5 小时前
【C语言】自定义数据类型2——联合体与枚举
c语言·开发语言·算法
发现一只大呆瓜6 小时前
Vite凭什么这么快?3分钟带你彻底搞懂 Vite 热更新的幕后黑手
前端·面试·vite
x_yeyue8 小时前
三角形数
笔记·算法·数论·组合数学
Patrick_Wilson8 小时前
知识沉淀的四层模型:从个人笔记到企业资产,让文档真正长出复利
面试·程序员·ai编程
橙序员小站9 小时前
人人都在鼓吹的OPC,我想给你泼盆冷水
面试·创业
念何架构之路9 小时前
Go语言加密算法
数据结构·算法·哈希算法
AI科技星9 小时前
《数学公理体系·第三部·数术几何》(2026 年版)
c语言·开发语言·线性代数·算法·矩阵·量子计算·agi
失去的青春---夕阳下的奔跑9 小时前
560. 和为 K 的子数组
数据结构·算法·leetcode
黎阳之光9 小时前
黎阳之光:以视频孪生重构智慧医院信息化,打造高标项目核心竞争力
大数据·人工智能·物联网·算法·数字孪生