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

数组题解——二分查找【LeetCode】

704. 二分查找

算法逻辑分析

  1. 初始化边界

    • left 设为0,right 设为len(nums),表示左闭右开区间 [left, right)
    • 这意味着搜索区间包含下标left,但不包含下标right
  2. 循环条件

    • while left < right:,只要left小于right,就一直循环。
    • 终止时,left == right,搜索区间为空。
  3. 中点计算

    • mid = (left + right)//2,取当前区间的中间位置。
  4. 比较并缩小区间

    • if nums[mid] < target:
      • 目标值在mid右侧,left = mid + 1
      • 新区间为[mid+1, right)
    • elif nums[mid] > target:
      • 目标值在mid左侧,right = mid
      • 新区间为[left, mid)
    • else:
      • 找到了目标值,返回mid
  5. 未找到目标值

    • 如果循环结束还没找到,返回-1

核心点

  • 左闭右开区间 [left, right):这是这段代码的核心思想。每次区间调整都严格遵循这个规则,保证循环不变量(即任何时候区间外都不是目标)。
  • 区间调整方式
    • 小于目标时,left = mid + 1,排除mid
    • 大于目标时,right = mid,排除mid右侧。
  • 循环不变量保证:
    • 循环内始终有:nums[left-1] < targetnums[right] >= target(伪注释)。
  • 终止条件:区间为空,说明不存在目标元素。
# 左闭右开
class Solution:def search(self, nums: List[int], target: int) -> int:left, right = 0, len(nums)while left < right:# 循环不变量:# nums[left-1] < target# nums[right] >= targetmid = (left + right)//2if nums[mid] < target:left = mid + 1elif nums[mid] > target:right = midelse:return midreturn -1

复杂度分析

时间复杂度

  • 每次循环将区间减半,最坏情况下要查找log2(n)次。
  • 因此,时间复杂度为 O(log n)

空间复杂度

  • 只用常数级别的辅助变量(leftrightmid等)。
  • 空间复杂度为 O(1)
http://www.lqws.cn/news/525223.html

相关文章:

  • 八股文——JAVA基础:说一下C++与java的区别
  • 黑马python(十六)
  • GBDT:梯度提升决策树——集成学习中的预测利器
  • 设计模式-桥接模式、组合模式
  • Selenium 二次封装通用页面基类 BasePage —— Python 实践
  • 矩阵题解——螺旋矩阵【LeetCode】
  • 大模型推理-高通qnn基础
  • PYTHON从入门到实践5-列表操作
  • 超级好用的小软件:geek,卸载软件,2m大小
  • vue2简单的路由切换
  • OpenCV图像旋转:单点旋转与图片旋转
  • Windows10中设置多个虚拟IP方法
  • Linux size命令详解
  • Boss:攻击
  • Azure虚拟机添加磁盘
  • Docker、Docker composer与Docker desktop
  • H5录音、图文视频IndexDB储存最佳实践:用AI生成语音备忘录
  • Fisco Bcos学习 - 开发第一个区块链应用
  • 高防IP能不能防住500GDdos攻击
  • AI系列1-1: 离线部署通义大模型及持续修正-RedHat+NVIDA GPU
  • Java课后习题(编程题)
  • SpringBoot高校党务系统
  • 激光雷达全链路光学系统及探测器能量耦合分析
  • python的少数民族音乐网站系统
  • request这个包中,get 这个方法里传入的是params ,post这个方法里传入的是data 和 json。这个区别是什么?
  • HarmonyOS5 如何性能优化?
  • Vue Devtools “Open in Editor” 配置教程(适用于 VSCode 等主流编辑器)
  • PyTorch RNN实战:快速上手教程
  • 笔记03:布线-过孔的调用与添加
  • 求助deepsee 生成语法树代码