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

【算法与数据结构】二分法及其应用

二分法及其应用

文章目录

      • 二分法及其应用
    • @[toc]
        • 1.二分法
        • 2.二分法的应用
          • (1)在一个有序数组中,找到某个数,没有返回False
          • (2)在一个有序数组中,找到≥某个数最左侧的位置
          • (3)局部最小值问题(无序数组二分)

1.二分法

二分法适核心逻辑是不断取中间值缩小搜索范围,时间复杂度O ( log ⁡ n ) O(\log n)O(logn),远优于遍历算法复杂度O ( n ) O(n)O(n)


2.二分法的应用
(1)在一个有序数组中,找到某个数,没有返回False

思路:

升序数组,左边界left、右边界right,取中点mid比较:

  • arr[mid] == target:找到,返回mid
  • arr[mid] < target:目标在右半区,left = mid + 1
  • arr[mid] > target:目标在左半区,right = mid - 1
  • 循环结束未命中则不存在,返回False
defbinary_search(mylist,target):left=0right=len(mylist)-1whileleft<=right:mid=left+(right-left)//2ifmylist[mid]==target:returnmidelifmylist[mid]<target:left=mid+1else:right=mid-1returnFalseprint(binary_search([1,2,3,3,3,5,8],2))# 结果:1

这是一个普通二分,找到相等就跑路,只求 “有没有”。

(2)在一个有序数组中,找到≥某个数最左侧的位置

思路:

  • arr[mid] >= target:记录当前位置,向左搜,right = mid - 1
  • arr[mid] < target:向右搜,left = mid + 1
  • 若全部小于 target,返回数组长度。
deffindleftnumber(mylist,target):ans,left,right=len(mylist),0,len(mylist)-1whileleft<=right:mid=left+(right-left)//2ifmylist[mid]>=target:ans=mid right=ans-1else:left=left+1returnansprint(findleftnumber([1,2,3,3,3,5,8],2))# 结果:1print(findleftnumber([1,2,3,3,3,5,8],100))# 结果:7(没找到就会返回初始化时候标定的mylist的长度)

这是一个左边界二分,相当于满足条件的先记下来,继续往左找,只求最左边那一个。

(3)局部最小值问题(无序数组二分)

问题描述

给定数组,相邻元素不相等,定义局部最小:

  1. arr[0] < arr[1]:0 号位置是局部最小;

  2. arr[n-1] < arr[n-2]:末尾是局部最小;

  3. 中间位置i ii满足arr[i]<arr[i-1] and arr[i]<arr[i+1]i ii为局部最小。

    要求:在O ( log ⁡ n ) O(\log n)O(logn)时间找出任意一个局部最小值下标。

deffindlocalmin(mylist):left,right=0,len(mylist)-1ifmylist[0]<mylist[1]:return0ifmylist[len(mylist)-2]>mylist[len(mylist)-1]:returnlen(mylist)-1whileleft<=right:mid=left+(right-right)//2ifmylist[mid]<mylist[mid+1]andmylist[mid]<mylist[mid-1]:returnmidelifmylist[mid]>mylist[mid+1]:left=mid+1elifmylist[mid]<mylist[mid-1]:right=mid-1returnFalseprint(findlocalmin([4,2,3,4,5,4.3,8]))# 结果:1
http://www.jsqmd.com/news/1161592/

相关文章:

  • 2026长沙翡翠臻品合规回收实测:六区两市一县全域服务网络与透明变现权威指南 - 分享测评官
  • iOS 27家庭App AI摄像头:智能安防技术解析与实践指南
  • 致远协同管理软件,覆盖政企全场景的一体化 OA 协同办公平台
  • DDrawCompat深度解析:Windows系统下DirectDraw兼容性解决方案
  • 8大网盘直链下载难题与开源解决方案:LinkSwift技术深度解析
  • ThinkPad X230能否成为你的第一台黑苹果设备?深度解析与实战指南
  • STM32与TLE 6208-6G直流电机控制方案详解
  • REPENTOGON完整安装指南:如何为《以撒的结合:悔改》安装革命性脚本扩展器
  • 2026年成都办公家具高性价比推荐指南 - 谁都没有我好看
  • MetaboAnalystR终极指南:从质谱数据到生物学洞察的完整代谢组学分析解决方案
  • 2026年石家庄哪里回收劳力士手表价格高?桥西区城角街672号赵掌柜二奢专业回收梵克雅宝,芝伯,萧邦,雅典 - GrowthUME
  • tml终端标记语言入门:如何轻松实现命令行彩色格式化输出
  • 新鲜香枕榴莲供应商揭秘:产地直采,每一口都是纯粹自然香甜 - 浙江稻盛和夫
  • 3个深度数据驱动技巧:如何用GBFR Logs从新手进阶为《碧蓝幻想:Relink》数据分析专家
  • 3个简单步骤:如何在Windows电脑上直接安装APK文件
  • Python自动化LFI靶场通关:文件包含漏洞测试与命令注入实践
  • 为什么 AI 实时语音更偏向 WebRTC?
  • CVE-2016-2183 (SWEET32) 漏洞深度解析:从生日攻击原理到 64 位块密码风险
  • Cursor AI生成Svelte组件失败的12种报错解析,附可复用的错误码速查表(含v4.5.2兼容性验证)
  • (4-5-01)
  • DefaultEcs序列化教程:TextSerializer与BinarySerializer全面解析
  • 雅思自学网课怎么选?雅思哥分级选课指南与备考资源全解析 - 2027品牌AI展
  • 终极指南:如何用PlayIntegrityFix解决Android设备验证问题
  • 免费快速转换:5分钟从AI到PSD的完整无损分层指南
  • 骑砍Ⅱ霸主MOD开发(26)-本体域托管域外部DLL库
  • 为什么92%的Svelte开发者还没用Cursor AI生成组件?这3个配置陷阱正在拖慢你的迭代速度
  • Rust教程-3.1 所有权
  • 国产之光:海思方案低功耗LTE Cat.1物联网通信模组
  • Noto字体架构解析:多语言排版的技术实现与维护策略
  • openEuler社区会议管理终极指南:高效组织与参与线上讨论的10个技巧