Python二分查找【清晰易懂】
1. 二分查找是什么?
想象你在玩“猜数字”游戏:
-
对方心里想一个 1~100 的数字,你每次猜一个数,对方会告诉你是“大了”还是“小了”。
-
最快的方法:每次都猜中间的数!比如第一次猜50,如果大了,就猜25;如果小了,就猜75。
-
这样每次都能排除一半的可能性,最多7次就能猜中(因为2^7=128>100)!
这就是二分查找的核心思想——每次砍掉一半的搜索范围。
2. 二分查找的条件
-
必须是有序的列表(比如从小到大排列的数字)。
-
如果列表是乱序的,二分查找会失效。
3. 代码示例(Python)
def binary_search(arr, target):left, right = 0, len(arr) - 1 # 初始化搜索范围:整个列表while left <= right:mid = (left + right) // 2 # 取中间位置if arr[mid] == target:return mid # 找到了,返回索引elif arr[mid] < target:left = mid + 1 # 目标在右半部分else:right = mid - 1 # 目标在左半部分return -1 # 没找到# 测试
nums = [1, 3, 5, 7, 9]
print(binary_search(nums, 5)) # 输出2(因为5的索引是2)
print(binary_search(nums, 4)) # 输出-1(4不在列表中)
4. 复杂二分查找题目示例
在旋转有序数组中搜索目标值
题目描述
假设一个按升序排列的数组在某个未知点进行了旋转(例如 [0,1,2,4,5,6,7] 旋转后可能变成 [4,5,6,7,0,1,2])。
给定一个目标值 target,如果它存在于旋转后的数组中,则返回其索引,否则返回 -1。
要求时间复杂度为 O(log n)。
示例 1:
输入: nums = [4,5,6,7,0,1,2], target = 0 输出: 4(0的索引是4)
示例 2:
输入: nums = [4,5,6,7,0,1,2], target = 3 输出: -1(3不存在)
解题思路
处理局部有序性
旋转有序数组由两个升序子数组组成(例如 [4,5,6,7,0,1,2] 分为 [4,5,6,7] 和 [0,1,2])。
-
左半部分:所有元素 ≥ 第一个元素(如
4,5,6,7≥4)。 -
右半部分:所有元素 < 第一个元素(如
0,1,2<4)。
需要区分左半部分还是右半部分是因为二分查找依赖有序性,只有确定 mid 在哪个部分,才能正确判断 target 可能的位置。
直观例子
以数组 [4,5,6,7,0,1,2] 和 target=0 为例:
-
初始状态:
left=0,right=6,mid=3(值7)。nums[3] >= nums[0](7 >= 4)→mid在左半部分。target=0不在[4,7)范围内 → 调整left=4。 -
下一轮:
left=4,right=6,mid=5(值1)。nums[5] < nums[4](1 < 0不成立)→mid在右半部分。target=0不在(1,2]范围内 → 调整right=4。 -
找到目标:
nums[4] == 0,返回索引4。
代码实现
def search(nums, target):left, right = 0, len(nums) - 1while left <= right:mid = (left + right) // 2if nums[mid] == target:return mid# 判断mid位于左半部分还是右半部分if nums[mid] >= nums[left]: # mid在左半部分(较大的一半)if nums[left] <= target < nums[mid]:right = mid - 1 # target在左半部分的左侧else:left = mid + 1 # target在左半部分的右侧或右半部分else: # mid在右半部分(较小的一半)if nums[mid] < target <= nums[right]:left = mid + 1 # target在右半部分的右侧else:right = mid - 1 # target在右半部分的左侧或左半部分return -1# 测试
nums = [4,5,6,7,0,1,2]
print(search(nums, 0)) # 输出4
print(search(nums, 3)) # 输出-1相关文章:
Python二分查找【清晰易懂】
1. 二分查找是什么? 想象你在玩“猜数字”游戏: 对方心里想一个 1~100 的数字,你每次猜一个数,对方会告诉你是“大了”还是“小了”。 最快的方法:每次都猜中间的数!比如第一次猜50,如果大了&…...
Azure SDK 使用指南
Azure SDK(软件开发工具包)是一组由微软提供的工具和库,旨在帮助开发者以多种编程语言(如 .NET、Java、Python、JavaScript 等)与 Azure 服务进行交互。 通过使用 Azure SDK,开发者可以更高效地构建、部…...
【STL】vector介绍(附部分接口模拟实现)
文章目录 1.介绍2.使用2.1 vector的构造2.2 vector空间相关接口2.2.1 size()2.2.2 capacity()2.2.3 empty()2.2.4 resize()2.2.5 reserve() 2.3 vector的增删查改2.3.1 push_back()2.3.2 insert()2.3.3 pop_back()2.3.4 erase()2.3.5 swap()2.3.6 operator[]注:关于…...
一周掌握Flutter开发--8. 调试与性能优化(上)
文章目录 8. 调试与性能优化核心技能8.1 使用 Flutter DevTools 分析性能8.2 检查 Widget 重绘(debugPaintSizeEnabled)8.3 解决 ListView 卡顿(ListView.builder itemExtent) 其他性能优化技巧8.4 减少 build 方法的调用8.5 使用…...
游戏引擎学习第182天
回顾和今天的计划 昨天的进展令人惊喜,原本的调试系统已经被一个新的系统完全替换,新系统不仅能完成原有的所有功能,还能捕获完整的调试信息,包括时间戳等关键数据。这次的替换非常顺利,效果很好。 今天的重点是在此基…...
2025计算机毕设全流程实战指南:Java/Python+协同过滤+小程序开发避坑手册
技术框架的选择是项目开发的关键起点,直接影响开发效率和最终成果质量。然而,许多开发者在选择技术框架时面临困难:现有知识储备不足以支撑复杂项目需求,团队经验有限,框架选择缺乏前瞻性常导致后期问题。尽管技术框架…...
C语言_数据结构_二叉树
【本节目标】 树的概念及结构 二叉树的概念及结构 二叉树的顺序结构及实现 二叉树的链式结构及实现 1. 树的概念及结构 1.1 树的概念 树是一种非线性的数据结构,它是由n(n>0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为…...
Compare全目录文件比较内容(项目中用到过)
第一步:找到“会话”——“会话设置” 会话设置弹框信息 第二步:选择“比较”tab标签 比较内容:选中二进制比较 第三步:选中所有文件 第四步:右键选中“比较内容” 第五步:选中“基于规则的比较”...
3.26[a]paracompute homework
5555 负载不平衡指多个线程的计算量差异显著,导致部分线程空转或等待,降低并行效率。其核心矛盾在于任务划分的静态性与计算动态性不匹配,尤其在处理不规则数据或动态任务时尤为突出。以稀疏矩阵的向量乘法为例,假设其非零元素分…...
视觉大模型CLIP论文精读
论文:Learning Transferable Visual Models From Natural Language Supervision 代码:https://github.com/openai/CLIP 摘要 最先进的计算机视觉系统是针对预测一组固定的、预先确定的对象类别进行训练的。这种受限的监督形式限制了它们的通用性和可用…...
【AI】Orin NX+ubuntu22.04上移植YoloV11,并使用DeepStream测试成功
【AI】郭老二博文之:AI学习目录汇总 1、烧写系统 新到的开发板,已经烧写好Ubuntu系统,版本为22.04。 如果没有升级到Ubuntu22.04,可以在电脑Ubuntu系统中使用SDKManager来烧写Ubuntu系统,网络情况好的话,也可以直接将CUDA、cuDNN、TensorRT、Deepstream等也安装上。 2…...
HTML文档流
1. 基础定义 “文档流(Normal Flow)是指HTML元素在页面中默认的排列方式。在标准文档流中,块级元素会从上到下垂直排列,每个元素占据一整行;而行内元素则从左到右水平排列,直到空间不足才会换行。” 2. 详细解释 可以进一步展开…...
链表的创建:头插法与尾插法详解(数据结构)
C 链表的创建:头插法与尾插法详解 链表(Linked List)是一种重要的数据结构,适用于插入和删除操作频繁的场景。本文介绍 两种常见的链表构建方法: 尾插法(Append / Tail Insertion):…...
MyBatis中mapper.xml 的sql映射规则
一、SQL 映射文件核心元素 MyBatis 映射文件的顶级元素(按定义顺序): cache:命名空间的缓存配置。cache-ref:引用其他命名空间的缓存。resultMap:自定义结果集映射。sql:可重用的 SQL 片段。i…...
深入解析 Java 类加载机制及双亲委派模型
🔍 Java的类加载机制是确保应用程序正确运行的基础,特别是双亲委派模型,它通过父类加载器逐层加载类,避免冲突和重复加载。但在某些特殊场景下,破坏双亲委派模型会带来意想不到的效果。本文将深入解析Java类加载机制、…...
糖尿病大模型预测及临床应用研究智能管理系统技术文档
目录 1. 数据工程规范1.1 多源数据集成1.2 特征工程架构 2. 核心模型架构2.1 分层预测网络2.2 动态血糖预测模块 3. 实时决策系统3.1 术中预警协议3.2 麻醉方案优化器 4. 验证体系实现4.1 数字孪生验证平台4.2 临床验证流程 5. 系统部署方案5.1 边缘计算架构5.2 性能指标 6. 安…...
MySQL数据库精研之旅第四期:解锁库操作高阶技能
专栏:MySQL数据库成长记 个人主页:手握风云 目录 一、查看所有表 1.1. 语法 二、创建表 2.1. 语法 2.2. 示例 2.3. 表在磁盘上对应的⽂件 三、查看表结构 3.1. 语法 3.2. 示例 四、修改表 4.1. 语法 4.2. 示例 五、删除表 5.1. 语法 5.2.…...
【DevOps】DevOps and CI/CD Pipelines
DevOps 是一种将开发与运维实践相结合的模式,旨在缩短软件开发周期并交付高质量软件。 DevOps 是什么? 开发团队与运维团队之间的协作 • 持续集成与持续交付(CI/CD) • 流程自动化 • 基础设施即代码(IaC)…...
Oracle详解
Oracle 数据库是一款由 Oracle 公司开发和维护的关系数据库管理系统(RDBMS)。Oracle 数据库广泛应用于企业级应用中,尤其是在需要高可用性、高性能和安全性的场景。以下是对 Oracle 数据库的详细介绍,包括它的各个方面。 一、Ora…...
VS自定义静态库并在其他项目中使用
1、VS创建一个空项目或者静态库项目 2、右键项目 属性 修改生成文件类型 3、生成解决方案 4、复制.h文件和.lib文件作为静态库 5、创建一个新项目 测试使用新生成的静态库 在新项目UseStaticLib中加一个新文件夹lib,lib中放入上面的.h和.lib文件。 6、vs中右…...
5G AAU(Active Antenna Unit)详细介绍
5G AAU(Active Antenna Unit)详细介绍 1. 定义与架构 5G AAU(Active Antenna Unit,有源天线单元)是5G无线基站系统中的核心组件,它集成了射频(RF)和天线功能,是4G时代R…...
力扣32.最长有效括号(栈)
32. 最长有效括号 - 力扣(LeetCode) 代码区: #include<stack> #include<string> /*最长有效*/ class Solution { public:int longestValidParentheses(string s) {stack<int> st;int ans0;int ns.length();st.push(-1);fo…...
【计算机网络中的奈氏准则与香农定理】
文章目录 一、前言二、奈氏准则1. 概念2. 奈氏准则公式3. 奈氏准则的意义 三、香农定理1. 概念2. 香农定理公式3. 香农定理的意义 四、奈氏准则与香农定理的对比五、应用示例1. 奈氏准则示例2. 香农定理示例 六、总结 一、前言 在计算机网络中,数据的传输速率与信道…...
vue3 项目中预览 word(.docx)文档方法
vue3 项目中预览 word(.docx)文档方法 通过 vue-office/docx 插件预览 docx 文档通过 vue-office/excel 插件预览 excel 文档通过 vue-office/pdf 插件预览 pdf 文档 安装插件 npm install vue-office/docx vue-demi示例代码 <template><Vu…...
DHCP(Dynamic Host Configuration Protocol)原理深度解析
目录 一、DHCP 核心功能 二、DHCP 工作流程(四阶段) 三、关键技术机制 1. 中继代理(Relay Agent) 2. Option 82(中继信息选项) 3. 租期管理 4. 冲突检测 四、DHCP 与网络架构交互 1. MLAG 环境 2.…...
创建login.api.js步骤和方法
依次创建 login.api.js、home.api.js...... login.api.js、home.api.js 差不多 导入到 main.js main.js 项目中使用...
基于springboot二手交易平台(源码+lw+部署文档+讲解),源码可白嫖!
摘要 人类现已迈入二十一世纪,科学技术日新月异,经济、资讯等各方面都有了非常大的进步,尤其是资讯与网络技术的飞速发展,对政治、经济、军事、文化等各方面都有了极大的影响。 利用电脑网络的这些便利,发展一套二手交…...
帕金森患者的生活重塑:从 “嘴” 开启康复之旅
当提到帕金森病,许多人会联想到震颤、僵硬和行动迟缓等症状。这种神经系统退行性疾病,给患者的生活带来了巨大的挑战。然而,你可知道,帕金森患者恢复正常生活,可以从 “嘴” 开始管理? 帕金森病在全球影响着…...
相生、相克、乘侮、复杂病机及对应的脏腑功能联系
一、五行相生关系(母子关系) 五行生序脏腑关系生理表现举例木生火肝(木)滋养心(火)肝血充足则心血旺盛火生土心(火)温煦脾(土)心阳充足则脾胃运化功能正常土…...
鸿蒙OS 5 架构设计探秘:从分层设计到多端部署
文章目录 鸿蒙OS架构设计探秘:从分层设计到多端部署一、鸿蒙的分层架构设计二、模块化设计的精髓三、智慧分发设计:资源的动态调度四、一次开发,多端部署的实践总结与思考 鸿蒙OS架构设计探秘:从分层设计到多端部署 最近两年来&a…...
