二分查找没有变形

详解二分查找的两种写法以及二分查找的六种变形 本文详解了二分查找的两种写法以及二分查找的六种变形。 阅读详情

二分查找没有变形

  • 经典的二分查找相信大家都已烂熟于心,但是经典的二分查找只给出了true或false的回答,也就是是否存在,存在返回true,不存在则返回false。但是,基于经典的二分查找却会有很多的变式,每一种变式可能都会有相应的代码解决方案,本文之所以命名为"二分查找没有变形",是因为我找到了一个统一的思路,无论哪种变形都能根据此思路写出相应的代码。

本文默认约束

  1. 是从数组中查找某一个特定的元素(不一定是等于该目标元素,可能是大于等于目标元素,或者小于等于目标元素),并且数组从小到大排序;
  2. 左右边界分别为start=0,end=len(data)-1,也就是说查找的区间是[start,end],左右都是闭区间;
  3. 为了代码简洁,本文使用的是python语言,但是我并没有使用python语言特有的函数,只要有其他任何语言基础,都能够很方便转成自己需要的语言;
  4. 在求mid时,可能会有溢出,或者考虑到效率问题,本文重点在于统一二分查找的思路,对于这种细枝末节的优化问题不予讨论。
  5. 上述所有约束都是为了描述方便,我相信只要你看懂了我的思路,可以很方便地举一反三,比如对于约束1,数组默认从小到大排序,那么只要你看懂了我的思路,数组如果是从大到小排序也是很快能够掌握的。

思路分析

  • 以一个具体的例子来说明我的思路
    在一个从小到大排序的数组data中,找到第一个大于等于key的元素的下标,如果不存在则返回-1.题目来了,那么如何写出相应的代码呢。
  • 步骤详解一(while 循环部分,注意循环的条件是start<=end):
    1. 先写出不满足条件的情况。题目中说"找到第一个大于等于key"的,先不管第一个还是最后一个,重点在于"大于等于key",所以,第一个判断条件就是if data[mid]<key,此时的决策因该是start=mid+1。注意这里不满足的条件只有一个,如果要求"找到第一个等于key的元素",那么不满足条件就有两种情况,所以要写两个if判断。
    2. 能够走到第二步说明已经满足了条件,也就是说当前data[mid]>=key,那么此时应该如何决策呢,这就是本文的重点,此时的决策依旧比较困难,还应该做一步判断,if mid==0 or data[mid-1]<key,这步判断是什么意思呢,就是解决题目中所要求的"第一个大于等于key"的问题,如果当前mid==0或者data[mid-1]<key都说明mid是data中"第一个大于等于key"的元素的下标,此时的决策是return mid。
    3. 能够走到这里说明第二步中if mid==0 or data[mid-1]<key不满足,也就是说mid>0 and data[mid-1]>=key,那么说明什么问题?说明在mid之前,还有大于等于key的元素,那么此时的决策应该是end=mid-1
  • 步骤详解二(跳出while循环部分)
    能够走到这里一定是start>end,也就是说数组中没有找到这样的元素,直接返回-1。
  • 完整的代码如下
def binary_search(data, start, end, key):
    while start <= end:
        mid = (start+end)//2
        if data[mid] < key:
            start = mid + 1
        elif mid == 0 or data[mid-1] < key:
            return mid
        else:
            end=mid-1
    return -1
  • 有了这个基础,那么写其他的变形就易如反掌了,如果还不太清楚,欢迎讨论。
谈一谈二分查找及其变形问题 何为二分查找? 二分查找,也称为折半查找,是用于在有序数组中查找特定元素的搜索算法。 二分查找的查找过程是将位于数组中间的元素值与要查找特定值进行比较。若中间元素值小于特定值,则说明该元素位于数组右侧区域,在右侧区域继续折半查找。若中间元素值大于特定值,则说明该元素位于数组左侧区域,在左侧区域继续折半查找。若等于,则返回中间元素的数组下标。 通过上面的示意图,我们可以看出对于一个具有 n 个元素... 阅读详情

相关推荐

顶刊《会计研究》数据复现|最新上市公司数智化数据

本文基于Python文本分析方法构建了中国A股上市公司数智化指标(1991-2024),通过识别年报中的"机器学习""智能医疗"等关键词,量化企业数字化与智能化融合程度。研究发现数智化企业更倾向于非正式渠道的定性披露以规避风险,该指标为监管完善信披规则提供了参考。研究还揭示了数智化对企业信息披露策略的转变,并提出了未来研究方向,包括数智化对绿色创新、ESG表现等影响机制。数据覆盖非金融类上市公司,采用文本挖掘技术构建结构化指标,为相关领域研究提供了微观基础。

PPdata_Academy的博客 1487

二分查找(二分法)

二分查找的需要设置三个指针,left,right,mid。其中left一开始指向第一个元素,同样right指向最后一个元素,而mid等于 (left+right)/ 2。相等时,表示它们指向同一个元素,这个元素可能是目标值,也可能是最后一个需要检查的元素。当left指针出现在right指针的右边则认为要查找的元素不存在,则退出循环。二分查找是常见的查找算法之一,想要进行二分查找的前提是元素之间有顺序的。如果数组中存在你想要查找的数,则返回下标,如果不存在则返回-1。

m0_71843016的博客 210

从零构建:如何用MATLAB打造你的第一个Stewart平台运动学仿真器

本文详细介绍了如何使用MATLAB从零构建一个六自由度Stewart平台运动学仿真器,涵盖基础理论、环境配置、运动学建模、动态轨迹规划和实时可视化实现。通过MATLAB的Robotics System Toolbox和Simulink等工具,读者可以掌握六自由度Stewart平台的逆运动学求解、正运动学求解及仿真系统集成,适用于飞行模拟器和精密定位等应用场景。

peach的博客 864

【二分查找】为什么我的二分查找总写错?

避免死循环,帮助你快速并准确无误的写出二分查找代码!

凡小白白的博客 817

强化学习 reward 曲线可视化:从基础绘制到顶刊级对比分析

本文详细介绍了强化学习reward曲线的可视化方法,从基础绘制到顶刊级对比分析。通过matplotlib和seaborn的实战示例,展示了如何优化曲线图的视觉效果,包括多实验对比、置信区间添加和分面图应用。文章还分享了顶刊级图表的进阶技巧,如字体排版、颜色选择和关键标注,帮助研究者提升论文图表质量。

weixin_29096377的博客 270

SAP PP未清生产订单关闭物料退料、新工单发料批量处理

( werks = '1001' lgort = 'A004' lgobe = '组装-成品组装' )( werks = '1002' lgort = 'C006' lgobe = '组装-二车间' )( werks = '1002' lgort = 'C007' lgobe = '组装-二车间' )( werks = '1001' lgort = 'A007' lgobe = '组装-MS' )( werks = '1001' lgort = 'A008' lgobe = '组装-GW' )

dingqing86的专栏 1192

2021-08-19-leetcode-00001

二分查找 704 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1 278 你是产品经理,目前正在带领一个团队开发新的产品。不幸的是,你的产品的最新版本没有通过质量检测。由于每个版本都是基于之前的版本开发的,所以错误的版本之后的所有版本都是错的。 假设你有 n 个版本 [1, 2, ..., n],你想找出导致之后所有版本出错的第一个错误的版本。 你可以通过调用 boo

三毛毳毳的博客 1261

从零到一:RagFlow源码架构深度解析与二次开发实战指南

本文深入解析RagFlow源码架构,提供从环境搭建到二次开发的全流程实战指南。作为企业级AI搜索框架,RagFlow通过模块化设计和多模态处理能力,支持自定义智能体开发与文搜文档功能,帮助开发者高效构建智能搜索系统。

w1x2y3的博客 267

浅谈c语言的二分法查找

二分查找,也被称作折半查找,能够极大优化算法的时间复杂度,二分查找的时间复杂度为log2^N(2为底,N为数据长度),其算法的主要思想就是:在一个有序的内容里面,每次取现有区间的中间那个值,和要查找的值进行比较,根据这两个值的大小对现有区间的左右端点重新设置,再次查找,直到找到目标或者区间不存在。

m0_65679465的博客 844

【Unity优化篇】| Unity3D场景 常用优化策略,遮挡剔除、层消隐距离技术 和 LOD多层次细节

本篇文章来简单介绍一下 Unity中几种常用3D场景优化策略 方法 对于整个项目来说,本文中出现的方法也只是冰山一角,慢慢积累学习吧! 内容包括遮挡剔除(Occlusion Culling)、层消隐距离技术 和 LOD多层次细节

努力前行,总会成为自己心中的那道光 1万+

手机相机Tuning专项调优(一):基础流程与图像主观评价标准建立实战解析

本篇为手机相机系统“Tuning专项调优”系列的开篇,深入剖析了当前手机相机Tuning的基本流程与图像主观评价标准的构建方法。结合实际工程经验与最新业界案例,详细介绍ISP调优和3A控制中涉及的主观评价标准,如锐度、色彩饱和度、噪声感知等,并提出一套可工程化落地的标准制定与评测实践体系,帮助工程师有效提升图像品质。

努力分享一些人工智能、计算机视觉、影像等相关的知识干货! 1933

二分查找法

前提 数组是有序的(如果无序,我们也可以考虑排序,不过要注意排序的复杂度 ) 术语 二分查找中使用的术语: target —— 要查找的值 index —— 当前位置 l 和 r —— 左右指针 mid —— 左右指针的中点,用来确定我们应该向左查找还是向右查找的索引 思维框架 首先定义搜索区间为 [left, right],注意是左右都闭合,之后会用到这个点 你可以定义别的搜索区间形式,不过后面的代码也相应要调整,感兴趣的可以试试别的搜索区间。 由于定义的搜索区间为 [left, right],

weixin_45960743的博客 274

CAPL未来发展方向展望

通过本文的学习,读者应该对CAPL的未来发展方向有了初步的了解。随着汽车电子系统的不断发展,CAPL也在不断演进,以支持更多的技术和应用场景。希望读者能够通过不断的学习和实践,掌握更多的CAPL技巧,提高自己的开发能力。

闲人编程的博客 1182

LeetCode:(Array-33)Search in Rotated Sorted Array

去哪网面试题:二分查找的变形题目   目的是为了在O(logn)的时间复杂度下解决此问题,所以用二分查找。 1 package com.hb.leetcode; 2 3 4 /* 5 * Search in Rotated Sorted Array 6 * 7 * Suppose a sorted array is rotated a...

90

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

你真的能搞定二分查找吗 — 二分查找及变形

看到一篇很有意思的文章就转过来了。。。 原文: 首先引用一下《编程珠玑》中的两句话:  尽管给了那么充裕的时间,只有大约10%的专业程序员能够写出正确的二分查找。尽管第一个二分查找程序于1946年就公布了,但是第一个没有bug的二分查找程序在1962年才出现。 当时看到这的时候,我觉得有点夸张。这里不去讨论是否真的花了20年才人们才写出正确的代码,但这两句话至少告诉

XiaYiZhanQiHang的博客 634

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

33. Search in Rotated Sorted Array

Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2). You are given a target value to search. If found in the array retur

wo111180611的专栏 165

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

二分查找法详解(6种变形)

二分查找法详解,看了还不会你找我!

Tokai___Teio的博客 5253

二分查找全解:原理、变形与极致工程实战

二分查找,是算法世界最经典、高效、又最容易“写错”的基础能力。本文全面剖析了二分查找的原理、适用场景、工程实现与经典变形题,包括查找第一个/最后一个等于、查找第一个大于等于、最后一个小于等于等常考边界题,以及在百万级数据如IP归属地等实际业务中的极致应用。通过案例讲解与代码分析,带你彻底吃透二分查找的“正确打开方式”,避免常见的死循环、越界、精度bug,让你面试、刷题和工程开发都能得心应手!

星之尘1021的博客 1352

算法精讲:二分查找(二)—— 变形技巧

问题类型二分对象判断条件典型案例找具体值数组索引经典二分查找 ✅找最值解答案值本身是否满足极值条件珂珂吃香蕉分段函数求极值函数参数函数增减性变化点寻找峰值(LeetCode 162)📈隐式数学解数学解空间解的存在性平方根(LeetCode 69)➗。

无限大的博客 1245

二分查找法及其四种变形(MATLAB)

已经从学校毕业一年,然而重温一下当年老师布置的各种算法作业,如今才刚刚领悟。因为是数学专业,所以就用MATLAB软件写了一番,也许还存在一些不足,但内心也有一丝的小成绩。今天,就写写二分查找法及其变形吧! 1. 二分查找法 1)非递归实现(源码) -----------------------------------------------------------------...

HuiningM的博客 3602

二分查找算法的四种变形题型

二分查找算法的四种变形题型查找第一个值等于给定值的元素查找最后一个值等于给定值的元素查找第一个大于等于给定值的元素查找最后一个小于等于给定值的元素算法实现 之前,我们了解了二分查找的基本算法情况,如果有小伙伴不是特别清楚的话,可以查看之前的文章二分查找算法 现在讨论的也就是二分查找的变种题型 在此,我先给出测试的案例,然后简单分析不同的变种题型需要注意的点,我们测试的数组,是基于有序的数组进行测试的。 原数组是nums[] = [1, 1, 2, 2, 2, 3, 4, 5, 5, 6, 6, 6, 9,

qq_20667511的博客 755

一种二分查找变形

原始的二分查找非常简单,只要找到值返回即可;但是如果某

Elvin_C_L的记录 823

[数据结构与算法] 二分查找II —变形问题

几种二分查找的变形问题。 ????????“十个二分九个错”。注意:终止条件、区间上下界更新方法、返回值选择。???????? 下述变形问题的前提是数据均以从小到大排序。 变形一:查找第一个值等于给定值的元素???? ​ 二分查找最简单的一种即有序数据集合中不存在重复的数据,在其中查找值等于某个给定值的数据。 将这个问题修改为:有序数据集合中存在重复的数据,找到第一个值等于给定值的数据,如下有序数组,其中,a[5],a[6],a[7]的值都等于 8,是重复的数据,要查找第一个等于 8 的数据,也就是下标

柚子 552

二分查找的变形问题

二分查找的变形问题思想 1:第一种想法:我们首先找到待查找值在数组中的位置,然后根据条件向前 或后索引看是否也等于该值。 num[i]==value我们再根据条件判断num[i-1]==value or num[i+1]=value这也来查找。 2:第二种想法:主要就是我们要如何让low and high收敛到目标位置上。这个就根据我提供我程序来看吧,写的比较啰嗦,小白笔记。 在一个有序的数组中查...

shumona的博客 235

你真的了解二分查找吗?二分查找:你不知道的细节——从基础到变形

二分查找是一种在有序数组中高效查找元素的算法,其核心逻辑是每次比较中间元素与目标值,从而排除一半的搜索范围。该算法的时间复杂度为对数级O(log n),远优于线性查找的O(n)。二分查找的前提是数组必须有序且支持随机访问。基本实现包括初始化左右指针、循环比较中间元素并调整搜索范围。进阶应用包括查找左边界(第一个大于等于目标值的位置)和右边界(最后一个小于等于目标值的位置)。常见错误包括边界条件处理不当、区间定义混淆和溢出问题。二分查找还可用于求平方根、查找旋转数组最小值等场景。

1203
上一篇: leetcode343. Integer Break
下一篇: leetcode 114. Flatten Binary Tree to Linked List
spencersong
博客等级 码龄9年 11粉丝 14原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值