当前位置: 首页 > java >正文

二分查找篇——搜索插入位置【LeetCode】三种写法,python2/python3

35. 搜索插入位置

一、算法逻辑(逐步通顺讲解每一步思路)

这段代码的目的是:在一个 升序排列的数组 nums 中查找 target 应插入的位置,使得数组依然保持有序。若 target 存在,则返回其索引;若不存在,返回插入后该值应处的位置索引。

代码整体使用的是一个自定义实现的「lower_bound」二分查找函数

✅ 1️⃣ 初始定义指针区间

  • left = 0right = len(nums),注意这里 right 是开区间(不包括数组最后一位索引);

  • 区间 [left, right) 表示搜索空间。

✅ 2️⃣ 循环条件 while left < right

只要搜索区间不为空(左指针小于右指针),就持续缩小范围。

✅ 3️⃣ 计算中点 mid = (left + right) // 2

标准二分方式,防止溢出。

✅ 4️⃣ 判断中点元素与目标值关系:

  • nums[mid] < target:说明目标值应该在 mid+1right 之间,因此将 left 指针右移到 mid + 1

  • 否则(即 nums[mid] >= target):目标值有可能是 mid 或在 mid 左边,将 right 指针左移到 mid

✅ 5️⃣ 最终返回 left(或 right

循环结束时,left 一定指向第一个 大于等于 target 的位置,即 lower_bound

这个值即为:

  • target 存在,则是其位置;

  • 若不存在,则是应该插入的位置,仍然合法保持有序。


二、核心点总结

✅ 本质是对数组使用 左闭右开区间 [left, right) 的二分查找 模板。
✅ 核心目标是实现 lower_bound,即查找 第一个 >= target 的下标
while left < right + right = mid 模式是标准 lower_bound 实现技巧;
✅ 最终返回的是合法插入位置,可以统一处理「存在与否」。

class Solution:def searchInsert(self, nums: List[int], target: int) -> int:return lower_bound(nums, target)def lower_bound(nums:List[int], target:int) -> int:left = 0right = len(nums)while left<right:mid = (left+right)//2if nums[mid]<target:left = mid+1else:right = midreturn left # 或者right

三、时间复杂度分析

每一轮循环都将搜索区间缩小一半,所以:

✅ 时间复杂度为 O(log n),其中 n = len(nums)


四、空间复杂度分析

算法仅使用了常数个变量 (left, right, mid),没有递归或额外数据结构:

✅ 空间复杂度为 O(1)

python2写法(包含闭区间左闭右开区间开区间三种写法)

# 闭区间写法
def lower_bound(nums, target):left, right = 0, len(nums) - 1  # 闭区间 [left, right]while left <= right:  # 区间不为空# 循环不变量:# nums[left-1] < target# nums[right+1] >= targetmid = (left + right) // 2if nums[mid] < target:left = mid + 1  # 范围缩小到 [mid+1, right]else:right = mid - 1  # 范围缩小到 [left, mid-1]return left# 左闭右开区间写法
def lower_bound2(nums, target):left = 0right = len(nums)  # 左闭右开区间 [left, right)while left < right:  # 区间不为空# 循环不变量:# nums[left-1] < target# nums[right] >= targetmid = (left + right) // 2if nums[mid] < target:left = mid + 1  # 范围缩小到 [mid+1, right)else:right = mid  # 范围缩小到 [left, mid)return left  # 或者 right# 开区间写法
def lower_bound3(nums, target):left, right = -1, len(nums)  # 开区间 (left, right)while left + 1 < right:  # 区间不为空mid = (left + right) // 2# 循环不变量:# nums[left] < target# nums[right] >= targetif nums[mid] < target:left = mid  # 范围缩小到 (mid, right)else:right = mid  # 范围缩小到 (left, mid)return rightclass Solution(object):def searchInsert(self, nums, target):return lower_bound(nums, target)  # 选择其中一种写法即可
http://www.xdnf.cn/news/14900.html

相关文章:

  • (电机03)分享FOC控制中SVPWM的输出关联硬件
  • 【AI智能体】智能音视频-硬件设备基于 WebSocket 实现语音交互
  • 【计算机组成原理】-CPU章节学习篇—笔记随笔
  • study_WebView介绍
  • JVM 基础 - 类字节码详解
  • Spring Boot 多数据源切换:AbstractRoutingDataSource
  • 精益管理与数字化转型的融合:中小制造企业降本增效的双重引擎
  • HTML+JS+CSS制作一个数独游戏
  • go go go 出发咯 - go web开发入门系列(一) helloworld
  • 【OceanBase诊断调优】—— 执行计划显示分区 PARTITIONS[P0SP9] 如何查询是哪个分区?
  • 8、保存应用数据
  • 基于Docker Compose部署Traccar容器与主机MySQL的完整指南
  • Xilinx Vivado开发环境快速导出hdf文件(bat批处理)
  • 独立开发A/B测试实用教程
  • 从问题出发看Spring的对象创建与管理
  • 人工智能-基础篇-23-智能体Agent到底是什么?怎么理解?(智能体=看+想+做)
  • 【docker】-1 docker简介
  • 10.6 ChatGLM3私有数据微调实战:24小时打造高精度模型,显存直降60%
  • 七牛云Java开发面试题及参考答案(60道面试题汇总)
  • Swift 解 LeetCode 320:一行单词有多少种缩写可能?用回溯找全解
  • 初识cdp协议(一)
  • 【Mac 从 0 到 1 保姆级配置教程 19】- 英语学习篇-我的英语工作流分享(AI 辅助学习)
  • APM与ChibiOS系统
  • Ubunt20.04搭建GitLab服务器,并借助cpolar实现公网访问
  • React-useReducer-useMemo
  • LabVIEW与FPGA超声探伤
  • 软考(软件设计师)存储管理—虚拟存储器管理,页面置换算法
  • Docker 稳定运行与存储优化全攻略(含可视化指南)
  • verilog中timescale指令的使用
  • Web Worker:让前端飞起来的隐形引擎