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

相关推荐
码农水水10 小时前
得物Java面试被问:消息队列的死信队列和重试机制
java·开发语言·jvm·数据结构·机器学习·面试·职场和发展
m0_7369191011 小时前
模板编译期图算法
开发语言·c++·算法
dyyx11111 小时前
基于C++的操作系统开发
开发语言·c++·算法
m0_7369191011 小时前
C++安全编程指南
开发语言·c++·算法
蜡笔小马11 小时前
11.空间索引的艺术:Boost.Geometry R树实战解析
算法·r-tree
-Try hard-11 小时前
数据结构:链表常见的操作方法!!
数据结构·算法·链表·vim
2301_7903009611 小时前
C++符号混淆技术
开发语言·c++·算法
我是咸鱼不闲呀11 小时前
力扣Hot100系列16(Java)——[堆]总结()
java·算法·leetcode
嵌入小生00711 小时前
单向链表的常用操作方法---嵌入式入门---Linux
linux·开发语言·数据结构·算法·链表·嵌入式
LabVIEW开发11 小时前
LabVIEW金属圆盘压缩特性仿真
算法·labview·labview知识·labview功能·labview程序