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

查找—二分法查找-边界判断,条件判断,二分法常见问题解析-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

px3 有感分析

px3 后续分析

qq_39707917的博客 3117

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

其中维基百科上是这样定义二分的二分法(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

大连海事大学课设题目/基于LM331的频率电压转换器

部分基于LM331的频压转换的实物连接问题

2301_76649592的博客 3227

R语言实战:三因素方差分析(ANOVA)从入门到精通(附完整代码解析)

本文详细介绍了如何使用R语言进行三因素方差分析(ANOVA),从数据准备、模型构建到结果解读与可视化,提供完整代码解析。通过实战案例,帮助读者掌握复杂交互效应的分析方法,适用于科研、教育等多个领域的数据分析需求。

weixin_29081101的博客 244

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

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

m0_63712057的博客 526

六轴机器人正解

采用的是John H.Craig在【机器人学导论】中的改进DH模型 1.六轴坐标系 2.DH参数 i αi−1\alpha_{i-1}αi−1​ ai−1a_{i-1}ai−1​ did_idi​ θi\theta_iθi​初值 1 0 0 0 0 2 -90 a1a_1a1​ 0 -90 3 0 a2a_2a2​ 0 -90 4 -90 a3a_3a3​ d4d...

m0_37581770的博客 2511

二分法的精髓——边界

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

qq_45734984的博客 1032

AIDD-人工智能药物设计-构建基于机器学习方法的在线预测平台高准确预测药物诱导骨毒性

在此基础上,提取多种药物分子特征,包括分子指纹(如MACCS、Morgan、RDKit、TopologicalTorsion、AtomPairs与Descriptors)及分子图谱,通过Transformer编码器与神经网络进行机器学习模型训练。最后,将训练好的模型部署为在线Web服务器(BoneToxPD),供用户快速预测药物的骨毒性。本研究不仅在骨毒性预测的准确性方面取得了突破,还在模型解释性方面提供了新的视角,通过注意力机制精准识别出影响骨毒性的关键化学基团,推动药物研发领域更安全、更高效的发展。

itwangyang520的博客 1081

RK AVS双目融合记录

NOTE] 调试平台双目avs融合调试,需要先保证两个摄像头能正常出图同时出流。使用默认工具测试vi->avs->venc通路是否正常,-a可指定isp效果文件需要开启CONFIG_VIDEO_ROCKCHIP_AVSP和CONFIG_VIDEO_ROCKCHIP_FEC,dts中使能。

mangofu的博客 104

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

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

【OS】AUTOSAR OS Alarm实现原理

AUTOSAR OS Alarm实现原理

qq_36056498的博客 1023

二分边界问题小结

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

Alanrookie的博客 876

pi-coding-agent 完整详解

pi-coding-agent是一个由Mario Zechner开发的专业AI编程助手,基于Node.js和TypeScript构建。核心功能包括:1)多级思考模式(ThinkingLevel),从none到ultra控制推理深度;2)对话压缩(compaction)管理长对话记忆;3)WebSocket实时通信支持流式交互。该智能体支持代码生成、调试、重构等专业编程任务,采用AI Agent架构,具备工具调用和多轮记忆能力。项目结构通常包含server、agent、config等模块,可通过二次开发扩展功

大坡3D软件开发 2429

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

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

二分法的边界问题

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

ShiYInyou的博客 1035

温度PID控制PLC程序

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

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

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

u014339447的博客 1619

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Devexpress16.2.6破解工具

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

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

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、付费专栏及课程。

余额充值