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

相关推荐
DeepModel2 小时前
【概率分布】卡方分布的原理、推导与实战应用
python·算法·概率论
tankeven3 小时前
NxN棋盘问题00:对角线特性
c++·算法
滴滴答滴答答3 小时前
机考刷题之 23&24&25 LeetCode 55&213&123
算法·leetcode·职场和发展
2501_911088233 小时前
C++中的代理模式变体
开发语言·c++·算法
客卿1233 小时前
岛屿问题--bfs的应用--二维网络题目学习
学习·算法·宽度优先
无限进步_3 小时前
【C++】只出现一次的数字 III:位运算的巧妙应用
数据结构·c++·git·算法·leetcode·github·visual studio
2401_900151543 小时前
代码覆盖率工具实战
开发语言·c++·算法
进击的小头3 小时前
第8篇:PI控制器设计实战演练
c语言·python·mcu·算法
乌萨奇也要立志学C++3 小时前
【洛谷】图论 图论最短路算法全解:从单源 Dijkstra 到多源 Floyd 模板与实战
算法·图论
AI科技星3 小时前
基于v=c空间本底光速螺旋运动的宏观力方向第一性原理推导:太阳系与地球系统的全维度观测验证
人工智能·线性代数·算法·机器学习·平面