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 为例:

  1. 初始状态:left=0right=6mid=3(值 7)。

    nums[3] >= nums[0]7 >= 4)→ mid 在左半部分。target=0 不在 [4,7) 范围内 → 调整 left=4
  2. 下一轮:left=4right=6mid=5(值 1)。

    nums[5] < nums[4]1 < 0 不成立)→ mid 在右半部分。target=0 不在 (1,2] 范围内 → 调整 right=4
  3. 找到目标: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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/73663.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关于Qt的各类问题

目录 1、问题&#xff1a;Qt中文乱码 2、问题&#xff1a;启动时避免ComBox控件出现默认值 博客会不定期的更新各种Qt开发的Bug与解决方法,敬请关注! 1、问题&#xff1a;Qt中文乱码 问题描述&#xff1a;我在设置标题时出现了中文乱码 this->setWindowTitle("算法…

关于我对接了deepseek之后部署到本地将数据存储到mysql的过程

写在前面 今天写一下使用nodejs作为服务端&#xff0c;vue作为客户端&#xff0c;mysql的数据库&#xff0c;对接deepseek的全过程&#xff0c;要实现一个很简单的效果就是&#xff0c;可以自由的询问&#xff0c;然后可以将询问的过程存储到mysql的数据库中。 文档对接 deeps…

游戏引擎学习第182天

回顾和今天的计划 昨天的进展令人惊喜&#xff0c;原本的调试系统已经被一个新的系统完全替换&#xff0c;新系统不仅能完成原有的所有功能&#xff0c;还能捕获完整的调试信息&#xff0c;包括时间戳等关键数据。这次的替换非常顺利&#xff0c;效果很好。 今天的重点是在此基…

CSS终极指南:从基础到高级实践

目录 一、CSS基础概念与核心语法 1.1 CSS的本质与作用 1.2 CSS语法结构 二、CSS与HTML结合的四种方式 2.1 内联样式&#xff08;Inline Style&#xff09; 2.2 内部样式表&#xff08;Internal Style Sheet&#xff09; 2.3 外部样式表&#xff08;External Style Sheet…

MATLAB 2024b深度学习新特性全面解析与DeepSeek大模型集成开发

MATLAB 2024b深度学习工具箱通过架构创新与功能强化&#xff0c;为科研创新和行业应用提供了全栈式解决方案。 第一&#xff1a;MATLAB 2024b深度学习工具箱新特性 1、MATLAB Deep Learning Toolbox 2、实时脚本&#xff08;Live Script&#xff09;与交互控件&#xff08…

.NET开源的智能体相关项目推荐

一、AntSK 由AIDotNet团队开发的人工智能知识库与智能体框架&#xff0c;支持多模型集成和离线部署能力。 核心能力&#xff1a; • 支持OpenAI、Azure OpenAI、星火、阿里灵积等主流大模型&#xff0c;以及20余种国产数据库&#xff08;如达梦&#xff09; • 内置语义内核&a…

Qt弹出新窗口并关闭(一个按钮)

参考&#xff1a;Qt基础 练习&#xff1a;弹出新窗口并关闭的两种实现方式&#xff08;两个按钮、一个按钮&#xff09;_qt打开一个窗口另一个关闭-CSDN博客 实现&#xff1a; 一个按钮&#xff0c;点击一次&#xff0c;按钮的名字从open window变为close window&#xff0c;…

PHP中yield关键字的使用

PHP版本>5.5 原理&#xff1a;yield关键字会生成一个Generator类的对象&#xff0c;PHP通过Generator实例计算出下一次迭代的值&#xff0c;再次返回一个Generator对象并停止循环&#xff08;即循环一次执行一次&#xff09;。 理解&#xff1a;使用在for/foreach/while循…

SpringBoot集成腾讯云OCR实现身份证识别

OCR身份证识别 官网地址&#xff1a;https://cloud.tencent.com/document/product/866/33524 身份信息认证&#xff08;二要素核验&#xff09; 官网地址&#xff1a;https://cloud.tencent.com/document/product/1007/33188 代码实现 引入依赖 <dependency><…

Tabby 一:如何在Mac配置保姆级教程(本地模型替换hugging face下载)

1. brew安装 mac需要先安装brew&#xff0c;如果本地已经安装过brew这一步可以忽略&#xff0c;遇到问题可以自己ai问 /bin/bash -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)" 可能遇到source .zprofile失败&#xff0c;因为…

C++中使用CopyFromRecordset将记录集拷贝到excel中时,如果记录集为0个,函数崩溃,是什么原因

文章目录 原因分析解决方案1. 检查记录集是否为空2. 安全调用COM方法3.进行异常捕获4. 替代方案&#xff1a;手动处理空数据 总结 在C中使用CopyFromRecordset将空记录集&#xff08;0条记录&#xff09;复制到Excel时崩溃的原因及解决方法如下&#xff1a; 原因分析 空记录集…

【算法学习计划】贪心算法(上)

目录 前言&#xff08;什么是贪心&#xff09; leetcode 860.柠檬水找零 leetcode 2208.将数组和减半的最少操作次数 leetcode 179.最大数 leetcode 376.摆动序列 leetcode 300.最长递增子序列 leetcode 334.递增的三元子序列 leetcode 674.最长连续递增序列 leetcode …

PC名词解释-笔记本的S0,S1,S2,S3,S4,S5状态

​&#x1f393;作者简介&#xff1a;程序员转项目管理领域优质创作者 &#x1f48c;个人邮箱&#xff1a;[2707492172qq.com] &#x1f310;PMP资料导航&#xff1a;PM菜鸟&#xff08;查阅PMP大纲考点&#xff09; &#x1f4a1;座右铭&#xff1a;上善若水&#xff0c;水善利…

可以把后端的api理解为一个目录地址,但并不准确

将后端的 API 理解为一个“目录地址”是可以的&#xff0c;但并不完全准确。让我们更详细地解释一下。 目录 1、生动形象了解api 2、后端 API 的作用 3、可以将 API 理解为“目录地址”的原因 &#xff08;1&#xff09;URL 路径 &#xff08;2&#xff09;层次结构 4、…

Elasticsearch:使用 AI SDK 和 Elastic 构建 AI 代理

作者&#xff1a;来自 Elastic Carly Richmond 你是否经常听到 AI 代理&#xff08;AI agents&#xff09;这个词&#xff0c;但不太确定它们是什么&#xff0c;或者如何在 TypeScript&#xff08;或 JavaScript&#xff09;中构建一个&#xff1f;跟我一起深入了解 AI 代理的概…

5G智慧工厂专网部署:IPLOOK助力制造业数字化转型

5G专网 随着工业4.0时代的到来&#xff0c;制造业对高效、低延迟和智能化网络的需求日益增长。5G专网凭借其高速率、低时延和大连接特性&#xff0c;成为智慧工厂数字化转型的重要支撑。IPLOOK作为全球领先的移动核心网解决方案提供商&#xff0c;基于自身强大的5G核心网产品和…

第六届 蓝桥杯 嵌入式 省赛

参考 第六届蓝桥杯嵌入式省赛程序设计题解析&#xff08;基于HAL库&#xff09;_蓝桥杯嵌入式第六届真题-CSDN博客 一、分析功能 RTC 定时 1&#xff09;时间初始化 2&#xff09;定时上报电压时间 ADC测量 采集电位器的输出电压信号。 串行功能 1&#xff09;传送要设置…

第十二篇《火攻篇》:一把火背后的战争哲学与生存智慧

《孙子兵法》作为人类历史上最早的军事战略经典&#xff0c;其思想穿透了2500年的时空&#xff0c;至今仍在政治、商业乃至个人决策领域闪耀光芒。第十二篇《火攻篇》看似聚焦于具体的战术手段&#xff0c;实则蕴含了深刻的战争伦理与生存哲学。本文解读这一篇章如何用一把火点…

word光标一直闪的解决办法

在选项里&#xff0c;打开首选项&#xff0c;&#xff08;如果打不开&#xff0c;可以新建一个word也许就可以&#xff0c;实在不行只能靠眼疾手快&#xff0c;趁他还没闪赶紧点&#xff09; 选COM加载项&#xff0c;在里面取消勾选MicrosoftOfficePLUS

修改菜品-01.需求分析与设计

一.需求分析与设计 修改时要首先回显 设计时我们要设计哪些接口&#xff1f; 根据id查询菜品接口设计&#xff1a; 我们要根据id进行查询&#xff0c;因此在这里面id被作为路径参数。使用注解PathVariable。在查询菜品时&#xff0c;要将对应的口味也查出来&#xff0c;因此还…