二分法——一文学会如何确定边界

查找—二分法查找-边界判断,条件判断,二分法常见问题解析-python 提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录二分法常见问题一、二分法的前提和本质二、开始逐个问题解答1.解答疑问1/3/42.解答疑问23.标题对应的目标场景和Python代码目标1:寻找小于5的最大数字目标2:寻找等于5的第一个数字的索引目标3:寻找等于5的最后一个数字的索引目标3:寻找大于5的最小数字 二分法常见问题 —本文主要聚焦,如何解决这些问题, 提示:以下是本篇文章正文内容,下面案例可供参考 一、二分法的前提和本质 进入的二分法必须满足如下的前提 二分. 阅读详情

1.二分查找基本概述

  • 二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。
  • 二分法有「整数二分」和「实数二分」两种情况。实数二分的代码好写不易出错;整数二分的代码因为要考虑整除的问题,代码容易出错。
  • 二分法很容易出错。要找清楚答案在哪,区间在哪。
  • 二分查找最多查找⌈log2(n)⌉\lceil log_2(n) \rceil⌈log2​(n)⌉次
  • 二分查找最少查找1次

2.二分查找实现原理

假设我们比较的有序数列有三个数,我们比较一个元素的值和数组中间位置的元素的值进行比较,如果比中间的元素大,则在有序数组的后半部分进行查找;如果中间位置的元素的值小,则跟有序数组的前半部分进行比较;如果相等,则找到了比较元素的位置.

3.二分查找边界选择

二分查找边界的选择一般有两种情况。对于ls = {n,n,n,n,n,…,n};

  • 第一种:l=0,r=ls.lengthl = 0,r = ls.lengthl=0,r=ls.length——左闭右开
    下面代码里有详细总结
  • 第二种:l=0,r=ls.length−1l=0,r = ls.length-1l=0,r=ls.length−1——左闭右闭
    下面代码里有详细总结

4.代码——详细注解


public class BinarySearch {


    public static void main(String[] args) {
        int arry[] = {51, 53, 54, 55,55,55, 58, 64, 76};
//        System.out.println(binarySearch(arry,51));
        System.out.println(binarySearch4(arry,55));

        
    }



    /**
     * @D:查找一个数组,找得到返回索引。找不到返回-1
     * @param array
     * @param target
     * @return
     */
    public static int binarySearch(int array[],int target){
        int l = 0 ;
        int r = array.length-1;

        while (l<=r){
            int mid = (l+r)/2;
            if (array[mid]>target) {
                r = mid-1;
            }else if(array[mid]<target){
                l = mid+1;
            }else{
                return mid;
            }
        }
        return -1;
    }



    /*----------------------------------------------左闭右闭进行二分查找--------------------------------------------------- */


    /*
    代码总结:
        对于左开右闭的区间,有如下规律:
        	条件:r<=l
            前继代码:
            if(array[mid]<=target)
                ans = mid;
                r = mid-1;
            else:
                l = mid+1;

            后继代码:
            if(array[mid]<=target)
                ans = mid;
                l = mid+1;
            else:
                r = mid-1;
        l、r的选择,要么加1 要么减1.
     */


    /**
     * @D:如果没有这个元素,返回大于target第一个元素的下标(target的后继)(大于target的最小值);如果有多个相同的元素,那么返回第一个元素的下标;如果超过最大元素的值返回0
     * @param array
     * @param target
     * @return
     */
    public static int binarySearch1(int array[],int target){
        int l = 0;
        int r = array.length-1;
        int ans = 0;
        while (l<=r){
            int mid = (l+r)>>1;
            if (array[mid]>=target){
                ans = mid;
                r = mid-1;
            }else{
                l = mid+1;
            }
        }
        return ans;
    }



    /**
     * @D:如果没有这个元素,返回小于target的第一个元素的下标(前继代码)(小于target的最大值);如果存在多个相同的,返回最后一个元素的下标
     * @param array
     * @param target
     * @return
     */
    public static int binarySearch2(int array[],int target){
        int l = 0;
        int r = array.length-1;
        int ans = 0;
        while (l<=r){
            int mid = (l+r)>>1;
            if (array[mid]<=target){
                ans = mid;
                l = mid+1;
            }else{
                r = mid-1;
            }
        }
        return ans;
    }


    /*----------------------------------------------左闭右开进行二分查找--------------------------------------------------- */


    /*
    代码总结:
        对于左闭右开的区间,有如下规律:
        	条件:r<l
            r(大的一端)始终等于mid
            l用控制是否加1 或者 减1
     */





    /**
     * @D:后继代码;
     * @param array
     * @param target
     * @return
     */
    public static int binarySearch3(int array[],int target){
        int l = 0;
        int r = array.length;
        int ans = 0;
        while (l<r){
            int mid = (l+r)>>1;
            if (array[mid]>=target){
                ans = mid;
                r = mid;
            }else{
                l = mid+1;
            }
        }
        return ans;
    }


    /**
     * @D:前继代码
     * @param array
     * @param target
     * @return
     */

    public static int binarySearch4(int array[],int target){
        int l = 0;
        int r = array.length;
        int ans = 0;
        while (l<r){
            int mid = (l+r)>>1;
            if (array[mid]<=target){
                ans = mid;
                l = mid+1;
            }else{
                r = mid;
            }
        }
        return ans;
    }
}

关于二分法的边界问题及两种写法 关于二分法的边界问题及两种写法 二分查找法大家很熟悉了,对于一个有序序列,我们可以通过二分查找法在 O(logN)O(logN)O(logN) 的时间内找到想要的元素。但是,在代码实现的过程中,如果没有仔细理解清楚,二分法的边界条件有时会让人很头疼,而对边界条件的妥善处理是很能体现一个人的代码功底的,也通常是面试官会很关注的一个点。另外,大佬的题解中的二分法代码也总有几处小细节不同,但是大佬的代码都是怎么测都没问题的,自己却总因为某处细节没有处理好而出现问题。 实际上,二分法通常有两种细节略有不同的实现方式 阅读详情

相关推荐

二分的模板(花式二分)

作者:李冠华 链接:http://www.zhihu.com/question/36132386/answer/105595067 来源:知乎 著作权归作者所有,转载请联系作者获得授权。 对于不下降序列a,n为序列a元素的个数,key为关键字: 1.求最小的i,使得a[i] = key,若不存在,则返回-1 int binary_search_1(int a[], int n,

skysys的研究小屋 754

二分法求临界值[非递归算法]

二分法求临界值[非递归算法]

shuzipai的博客 1152

Java电商秒杀系统性能优化(一)——电商秒杀系统框架回顾

电商秒杀系统框架回顾项目简介外部依赖框架回顾项目要点项目中存在的问题小结 课程是免费的,课程地址如下:SpringBoot搭建电商秒杀项目,课程真的很棒,作者的思路很清晰,建议各位读者可以跟着视频练习一下这个项目; 项目简介 通过SpringBoot快速搭建的前后端分离的电商基础秒杀项目。项目通过应用领域驱动型的分层模型设计方式去完成:用户otp注册、登陆、查看、商品列表、进入商品详情以及倒计时秒...

ghw15221836342的博客 3721

二分法边界问题(通俗讲解)

其中维基百科上是这样定义二分的二分法(dichotomy)指的是将一个整体事物分割成两部分。也即是说,这两部分必须是互补事件,即所有事物必须属于双方中的一方,且互斥,即没有事物可以同时属于双方。百度百科是这样定义二分的二分法(Bisection method) 即一分为二的方法. 设[a,b]为R的闭区间. 逐次二分法就是造出如下的区间序列([an,bn]):a0=a,b0=b,且对任一自然数n,[an+1,bn+1]或者等于[an,cn],或者等于[cn,bn],其中cn表示[an,bn]的中点。

m0_70832728的博客 2956

A2B音频总线在智能座舱中的应用

车载A2B链路音频是智能座舱的核心功能,涵盖车载音响、语音识别、e-Call、消噪及回声消除等应用,随着汽车智能网联化的发展,对音频的开发要求也越来越高,需要加入更先进、功能丰富的信息娱乐功能以满足消费者的用户体验。但传统的模拟并行音频信号传输方式,难以在功能增加与整车轻量化(线缆的重量及成本减少)之间取得均衡。这时候就需要A2B音频总线了。A2B音频总线用于连接车辆中的音频设备,如麦克风(MIC)、功放(AMP)、多媒体主机(Head Unit)和T-BOX等。通过一条低成本的非屏蔽双绞线UTP,进行跨距

怿星科技的博客 3935

扫地机器人行业 企业篇-产业总部地理分布

中国扫地机器人产业呈现区域集聚特征,广东省以13家企业领跑全国,其中深圳独占9家(如大疆、云鲸智能等),佛山、广州、东莞各有分布。江苏省6家企业主要集中在苏州(科沃斯、追觅科技等)。北京聚集了石头科技、小米等4家品牌。浙江、山东、湖南等地也有代表性企业分布。国际品牌方面,美国iRobot、韩国三星/LG、日本松下等均在各自国家设立总部,而戴森、飞利浦等欧洲品牌则将中国运营中心设在上海或苏州。值得注意的是,部分品牌如由利、宝家丽虽为外资起源,但主要运营实体已落户中国。

智能硬件研发,欢迎交流 363

手撕二分法查找(边界值注意点)

所谓闭区间就是区间的包括边界值,如【1,2】的正整数区间,包含1,2这两个边界值,【1,1】区间包括1这个边界值,而开区间就不会包括边界值,如(1,2),(1,1)的正整数区间,没有包含任何数,也是无效区间,为空,(1,3)这样的区间才包含了2这个数值。理解了闭区间和开区间的概念,我们通过一道金典二分法查找算法题来实战。

m0_63712057的博客 526

我用 Python 把 Claude 变成了 “代码审查员“:每次提交前 AI 先 Review,Bug 漏网率降了 80%

这是成败的关键。我们需要给 Claude 立规矩,让它像一个严格的架构师那样思考。你是一名资深的首席软件架构师和安全专家。请审查以下 Git Diff 代码变更。你的任务是:1. **安全性检查**:寻找 SQL 注入、XSS、硬编码密钥、敏感信息泄露等。2. **潜在 Bug**:空指针、资源未关闭、竞态条件、逻辑死循环。3. **代码质量**:命名规范、冗余代码、可读性差、缺乏注释。4. **性能优化**:不必要的数据库查询、低效算法。

BUG猿的博客 145

二分法的精髓——边界

二分法朦胧面纱下的神秘真相~ 二分法相信很多童鞋都有所了解,因为其主要思想太简单了,我们人类一看就懂!但是只要自己亲自动手编写过使用二分法的程序,相信大部分人都为边界问题困扰过,其实二分法的边界处理是有玄机滴~ 如果读者只是想熟练地掌握二分法的编程框架,能够在竞赛、面试等场合手到擒来,那本篇博客保证够用。(俺滴瓜保熟 ????) 而若读者是第一次遇到边界问题,想要弄清楚她的神秘面纱下的所有细节,可以阅读下面这篇文章:浅谈二分的边界问题 笔者只是想记录一下自己的思考,方便日后复习和使用。 二分法边界问题最

qq_45734984的博客 1032

【Power Compiler手册】4.saif文件

功耗计算的准确性取决于切换活动数据的准确性。这些数据是通过使用RTL仿真或门级仿真生成的,并存储在SAIF文件中。在执行功耗优化和分析之前,应该使用SAIF文件来反标设计对象上的切换活动信息。SAIF是由Synopsys支持的ASCII格式,用于促进不同Synopsys工具之间的信息交换(参见IEEE 1801标准,附录J)。使用`read_saif`命令读取SAIF文件,使用`write_saif`命令写出SAIF文件。有关更多信息,请参见`read_saif`和`write_saif`命令的手册页。

QRBQ 2187

OpenCV-Python实战(26)——复杂场景下的实时物体检测与跟踪

本节介绍了一种鲁棒的特征跟踪方法,该方法速度足够快,能够实时应用于网络摄像头的视频流。首先,算法展示了如何在一幅图像中提取和检测重要特征——无论是我们感兴趣的模板图像(训练图像),还是预期包含该物体的更复杂场景(查询图像),这些特征都具有视角和尺寸不变性。然后对关键点进行聚类,找到两幅图像中特征点之间的匹配。在此基础上,可以计算出一个将一组特征点映射到另一组的透视变换矩阵。利用这些信息,我们可以在查询图像中勾勒出训练图像的轮廓,并对查询图像进行透视变换,使感兴趣的物体以直立状态显示在屏幕中央。

盼小辉丶的博客 1929

【二分法】多种情况下的边界条件,区间选择汇总,小结

1二分法 1.1二分查找1.2查找—个数1.2.1左闭右闭1.2.2左闭右开 1.3寻找最左满足条件的边界1.3.1左闭右闭 1.3.2左闭右开 1.4寻找最右满足条件的边界1.4.1左闭右闭 1.4.2左闭右开 1.5寻找最左插入位置1.5.1左闭右闭 1.5.2左闭右开 1.6寻找最右插入位置1.6.1左闭右闭区间1.6.2左闭右开区间

plain_rookie的博客 1490

基于图神经网络强化学习解决车辆路径规划问题(完整代码+报告)

基于图神经网络强化学习解决车辆路径规划问题(完整代码+报告)

3055

二分边界问题小结

每次可以说二分的边界问题都让博主非常头疼,今天仔细研究了一下,并做一下总结。参考博客。 对于二分的边界问题,我们主要要抓住我们在写二分法时的实现方式。而最最重要的是要分析while()循环内条件,并据此解决l和r的边界处理问题。 NO.1 循环条件(也可以说实现方式)决定左右边界的取值 常见好用的方法一共有两种: 循环条件一:while(l<=r),利用ans=mid记录下答案 这时代码中相应的ans=mid,l=mid+1,r=mid-1,具体见下面代码 while (l<=r)

Alanrookie的博客 876

基于卷积神经网络的球罐结构损伤识别

球罐结构损伤识别方法研究 摘要:本研究针对球形储罐(球罐)结构健康监测需求,提出基于卷积神经网络(CNN)的损伤识别方法。通过ANSYS有限元仿真构建包含5种裂纹深度的500组振动信号数据集,设计包含卷积层、池化层和全连接层的CNN网络架构。实验结果表明,该方法在训练集和测试集上分别达到98.4%和96.0%的准确率,验证了其在球罐焊缝损伤识别中的有效性。研究提供了完整的MATLAB实现代码,为球罐结构智能化监测提供了技术参考。 关键词:球罐结构;卷积神经网络;损伤识别;振动信号;深度学习

AI的内部世界的博客 120

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

二分法的边界问题

二分法是一种快速的搜索策略,在有序数组中选取中间位置进行判断,每一轮的搜索可以删除一半的数据域,从而将搜索的时间复杂度降为Ologn。但在利用二分法编写程序时,尤其需要注意二分法的边界条件,属于容易出错的细节问题。一般二分法有两种方式实现对边界的控制,分别是左闭右闭和左闭右开。

ShiYInyou的博客 1035

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

面试高频:二分法,多题多图,一次讲个明白

基础算法一:二分法,你思考过这些问题吗? 如何优雅的处理边界条件? 一定要数据有序时才能使用二分吗? 如何优雅的证明二分法的时间复杂度是O(logn)? 如果这几个问题你已经完全掌握了,可以点击右上角关闭。如果想听听我的心得,请读完下面内容。 1. 什么是二分法? ​ 二分法(Bisection method),即一分为二的的方法。对于在区间[a,b]上连续不断且满足f(a)*f(b)<0的函数y=f(x),通过不断地把函数f(x)的零点所在区间二等分,使区间两个端点逐步逼近零点,进而得到零点的近似值

u014339447的博客 1619

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

二分法的几种常见写法,边界处理

int search1(int q[],int left,int right,int target){ //定义封闭空间 while(left<=right){ //left==right 有效 int mid=left+(right-left)/2; if(q[mid]<target) left=mid+1; //目标在[mid+1,right]区间内 else if(q[mid]>target) right=mid-1; .

meizhenglong123的博客 253

二分法边界问题

学习自:https://blog.youkuaiyun.com/Lin_RD/article/details/105186081 一、二分法流程 二分法的一般流程如下: 确定左右边界:[left, right) 确定终止条件 获得中点 比较,缩减一半区间 二、确定左右边界 对于一个有序序列最小索引是0,最大索引是n−1n-1n−1 可以使用两种方法表示其区间: 左闭右开: [0,n)[0, n)[0,n) 左闭右闭:[0,n−1][0, n-1][0,n−1] 一般情况符合使用习惯的话都会使用左闭右开的方.

文杰的博客 1489

F.Pulling Their Weight(数学思维&均分两组的分界只)(2021年度训练联盟热身训练赛第一场)

传送门 题意:寻找一个中间值 t ,使得小于t的所有数的和与大于t的所有数的和能够相等(至于等于 t 的数则想办法均分),保证存在这样的t 值。 思路:题目说了所有数不会超过20000,那么我们就从小枚举 t 值,且在过程中以前求小于 t 的数和进行判断即可。 代码实现: #include<bits/stdc++.h> #define endl '\n' #define null NULL #define ll long long #define int long.

Satur9的博客 449

【算法】二分法边界

题目:35. 搜索插入位置 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 解析思路: 终于搞清楚二分法的边界了,无非是两种情况: 当数组中有target时,那最后mid一定等于对应的下标值,返回mid即可; 当数组中没有target时,left,right,mid最终一定会集中在某一个下标位置,假设为A! 此时,如果nums[mid]>target,意味着

sinat_31987445的博客 366

【数据结构与算法】二分法的边界问题总结

参考链接:代码随想录 二分查找涉及的很多的边界条件,逻辑比较简单,但就是写不好。例如到底是 while(left < right) 还是 while(left <= right),到底是right = middle呢,还是要right = middle - 1呢? 大家写二分法经常写乱,主要是因为对区间的定义没有想清楚,区间的定义就是不变量。要在二分查找的过程中,保持不变量,就是在while寻找中每一次边界的处理都要坚持根据区间的定义来操作,这就是循环不变量规则。 写二分法,区间的定义一般为

gongkeguo的博客 1396
上一篇: 迪杰斯特拉算法——dijkstra单源最短路径——贪心求解
下一篇: 函数式编程——python为例
Xcodd
博客等级 码龄6年 36粉丝 21原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值