二分查找的mid值确定以及check函数的确定

40 篇文章 3 订阅
订阅专栏
文章讨论了如何使用二分查找法确定mid值来高效地在排序数组中找到目标值的第一个和最后一个位置。两种mid值的确定方式会影响到check函数的处理以及区间划分,强调了在不满足条件时如何调整左右边界以复现区间。最后给出了力扣题目的例子,展示了在O(logn)时间复杂度内解决此类问题的算法实现。
摘要由CSDN通过智能技术生成

1.mid值确定

mid值的确定分为以下两种:

        int mid = left + right >> 1;

        int mid = left + right + 1 >> 1;

这两种写法的区别是: 第一种将区间分成 [0, mid]  [mid+1, n]

                                      第二种将区间分成[0,mid - 1] [mid, n]

那么根据需要,我们就要判断check函数的写法了:

2.check函数

 

 check函数的确定如上图所示,具体可以记忆为所找的范围为 target前面的符号的指向。

如果是  <= 则找的是全部 <= 目标的数值, 反之亦然。

确定了check函数之后,我们要确定二次取区间的问题,这个问题需要结合前面的mid值划分来解决

//对于 mid = left + right >> 1
//因为划分为了[0, mid] [mid + 1, n],
//所以不满足check后,要取left = mid + 1 ,right = mid 
//也就是说,要复现区间。

//对于 mid = left + right >> 1
//因为划分为了[0, mid] [mid + 1, n],
//所以不满足check后,要取left = mid + 1 ,right = mid 
//也就是说,要复现区间。
while( left < right)
{
    int mid = (right + left)/2 + left;
    if( check(mid) )
    {
        left = mid + 1;
    }
    else
    {
        right = mid;
    }
}


同理对于另一种mid取值的方法:

一样都是去复现划分后的情况[0,mid - 1] [mid , n]

while( left < right)
{
    int mid = (right + left + 1) /2 + left;
    if( check(mid))
    {
        right = mid -1;
    }
    else
    {
        left = mid;
    }
}

 

另外也可以这样理解:

  • 当  check(mid) == true 调整的是 l 时:计算 mid 的方式应该为 mid = l + r + 1 >> 1

  • long l = 0, r = 1000009;
    while (l < r) {
        long mid = l + r + 1 >> 1;
        if (check(mid)) {
            l = mid;
        } else {
            r = mid - 1;
        }
    }

    当当  check(mid) == true 调整的是 r 时:计算 mid 的方式应该为 mid = l + r >> 1

  • long l = 0, r = 1000009;
    while (l < r) {
        long mid = l + r >> 1;
        if (check(mid)) {
            r = mid;
        } else {
            l = mid + 1;
        }
    }

力扣有一道经典题目:

34. 在排序数组中查找元素的第一个和最后一个位置

给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。

如果数组中不存在目标值 target,返回 [-1, -1]

你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。

class Solution {
    public int[] searchRange(int[] nums, int target) {
        int[] ans = new int[]{-1, -1};
        int n = nums.length;
        if (n == 0) return ans;

        int l = 0, r = n - 1;
        while (l < r) {
            int mid = l + r >> 1;
            if (nums[mid] >= target) {
                r = mid;
            } else {
                l = mid + 1;
            }
        }
        if (nums[l] != target) {
            return ans;
        } else {
            ans[0] = l;
            l = 0; r = n - 1;
            while (l < r) {
                int mid = l + r + 1 >> 1;
                if (nums[mid] <= target) {
                    l = mid;
                } else {
                    r = mid - 1;
                }
            } 
            ans[1] = l;
            return ans;
        }
    }
}

还不会二分查找?看这一篇就够了
01-14 6394
详解整数二分和浮点数二分,以及对应的STL函数
二.二分查找(mid)
01-07 648
搜索旋转排序数组 class Solution: def search(self, nums: List[int], target: int) -> int: def findElement(nums, target): left = 0; right = len(nums) - 1 while left <= right: mid = (left + right) // 2
二分法:根据mid的将待搜索区间分为两个部分
Powerstot的博客
04-24 278
主要思路 定义target在左闭右闭区间内,即在 nums[left…right] 里查找 target 循环条件写成while(left < right),在只分两个区间讨论的情况下,循环退出之后一定有 left == right 根据nums[mid]所在区间把待搜索区间分为两个部分: 存在目标元素的区间 和 一定不存在目标元素的区间 将会有两种分法: 例如,mid在在左边区间,那么区间就分为[left … mid] 与 [mid + 1… right]两部分, 右左边界分别为right =
二分查找时mid的计算方法
SparkSnail
10-21 4054
如果用mid=(low+high)/2,在运行时可能超时。 原因是int类型最大表示范围是2147483647,详细分析见我之前的一篇文章点击打开链接 如果输入的low和high都接近2147483647,两个数相加就会溢出,变成一个负数。 例: #include int main(){ int low = 2147483647; int high = 2147483646; pri
二分查找时关于mid的计算问题
一个人的博客
01-02 561
如果不注意,我们很可能就会这么写,但是这种写法一般会出现死循环的问题,为什么呢?因为>>的优先级低于+,这就会导致在计算mid时是先计算1+l,然后计算>>,也就是实际上的运算是这样的。这虽然只是一个小问题,但实际使用中,往往是细枝末节导致程序出现bug。养成良好习惯,才能让程序按照我们想的运行。对于这样的写法常常存在mid超界问题,也就是。外围再加上一个括号才是正确的写法。的最大,出现逻辑错误。
二分查找中关于mid定边界问题的解析(查找数组中小于等于特定的元素的最大下标/大于等于特定的元素的最小下标问题)
qq_53130059的博客
10-23 468
有时候写二分查找,我们会看见有的写 mid = (l + r) / 2,而有时候见到有人写 mid = (l + r +1) / 2,所以我有时候会心生疑问:我们究竟应该怎么写?这有什么规律吗?
二分算法 如何确定mid的
weixin_62967398的博客
03-10 413
关于二分算法的mid
263.【华为OD机试真题】孙悟空吃蟠桃(二分查找-Java&Python&C++&JS实现)
最新发布
一键难忘的博客
02-19 3520
【华为OD机试真题】孙悟空吃蟠桃(二分查找-Java&Python&C++&JS实现) 孙悟空爱吃蟠桃,有一天趁着蟠桃园守卫不在来偷吃。已知蟠桃园有N颗桃树,每颗树上都有桃子,守卫将在H小时后回来。 孙悟空可以决定他吃蟠桃的速度K(个/小时),每个小时选一颗桃树,并从树上吃掉K个,如果树上的桃子少于K个,则全部吃掉,并且这一小时剩余的时间里不再吃桃。 孙悟空喜欢慢慢吃,但又想在守卫回来前吃完桃子。 请返回孙悟空可以在H小时内吃掉所有桃子的最小速度K(K为整数)。如果以任何速度都吃不完所有桃子,则返回0。
leetcode基础题:二分查找
Esteban123的博客
01-11 252
力扣二分查找的一些简单题,所有代码均为通过
二分查找的实现方法----Java的binarySearch()方法】
Jerrychd的博客
04-03 3417
本文将介绍二分查找的实现方法。并对Java中的binarySearch()方法进行具体研究
二分查找二分查找mid溢出问题
森姐姐的博客
07-04 1383
二分查找时 求mid中间 溢出问题
二分查找——mid=(left+right)/2溢出
weixin_42322256的博客
11-17 4393
1、int型变量 int 是一种整型变量,占用 4 字节 32 比特时的范围是- 2147483648~2147483647,占用 2 字节 16 比特时的范围是- 32768~32767; 2、mid=(left+right)/2 二分查找时,求中间的操作步骤,写法mid = (left + right) / 2,这种写法存在问题。原因:left可能不断增大,如果到极限状态,也就是left达到了right-1的地步的时候刚好数组的长度又很大,那么就可能导致left + right的溢出出
二分查找板子(check()函数)
MrJinNEU的博客
03-01 8543
二分模板
二分check
I_think_I_like
11-09 967
昨天实验室的一个小比赛的一道题目。你能否体会那种,看着大家都会做,只有自己做不出来的绝望。 上下有界且单调,最大求最小,最小求最大,一般用二分搜索可以求解。 先看例题: ####题目描述 对于给定的一个长度为N的正整数数列A−i,现要将其分成M(M≤N)M(M≤N)M(M≤N)段,并要求每段连续,且每段和的最大最小。 关于最大最小: 例如一数列42451要分成333段 将其如下分段: [42][45][1] 第一段和为6,第2段和为9,第3段和为1,和最大为9。 将其如下分段: [4][24][5
二分法的mid确定
蜡笔小新冲鸭!!!
11-19 155
mid=right - (right - left) / 2
二分查找中mid注意
anniewwy的博客
03-25 3136
如果用mid=(left+right)/2,在运行二分查找程序时可能溢出超时。 因为如果left和right相加超过int表示的最大范围时就会溢出变为负数。 所以如果想避免溢出,不能使用mid=(left+right)/2,应该使用mid=left+(right-left)/2。 ...
python 二分查找_二分查找中 mid 的计算方法
weixin_39727706的博客
12-07 516
最近在刷 LeetCode 的过程中遇到许多 二分查找 的问题。在计算中间下标 mid 时,我是这样写的:mid = (left + right) // 2后面在评论中看了一些其他大佬的题解,发现大家都是这样写的:mid = left + (right - left) // 2下面就来探究一下为什么 mid = (left + right) // 2 的写法是错误的。int 类型int 是一种数...
整数二分 如何确定mid及划分条件
Wansit的博客
04-20 675
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一、pandas是什么? 二、使用步骤 1.引入库 2.读入数据 总结 前言 本文主要讲解整数二分mid如何 一、mid是什么? mid是middle的简写 二、mid的两种方式 1.mid= (l+r) / 2 2.mid= (l+r+1) / 2 三、为什么会有这两种区分?以及对应的查找方式是什么? 首先讲解一下为什么会有第二种,也就是+1...
二分查找
KongQueenie的博客
04-01 218
二分查找 1.二分查找分为普通查找,寻找相等元素第一个位置,相等元素最后一个位置。 2.还需要注意的是mid的计算,采用mid=low+(high-low)/2是为了避免这种计算方式mid=(low+high)/2,当low和high较大时,超出数据类型允许的范围。 public class BinarySearch { //设置mid,mid=low+(high-low)/2,...
二分查找模板与应用实例解析
代码展示了如何读输入、初始化范围以及执行二分查找过程。`l`和`r`分别代表当前查找范围的左右边界,直到找到目标或者范围缩小到指定精度。 二分查找的优点在于时间复杂度通常为O(log n),对于大规模数据,其...
写文章

热门文章

  • spring报错 XXX will not be managed by Spring 16662
  • hutool的json工具完成list和json转换 6012
  • MobaXterm的安装与使用 4109
  • nacos配置文件优先级 3177
  • ubuntu重启后丢失驱动 3163

分类专栏

  • java面试 16篇
  • java基础 9篇
  • springcloud 12篇
  • nginx 1篇
  • spring工具类 6篇
  • javase 7篇
  • spring 22篇
  • 微服务-nacos 1篇
  • 力扣刷题 40篇
  • 背包问题 3篇
  • 区间动规 2篇
  • mybatis-plus 1篇
  • springboot 13篇
  • mysql 8篇
  • mybatis 8篇
  • docker 2篇
  • ubuntu 5篇
  • redis 12篇
  • 爬虫 1篇
  • es 4篇
  • Vue.js 6篇
  • spring-security 4篇
  • 实验 2篇
  • javaWeb 6篇
  • 操作系统 1篇

最新评论

  • ubuntu安装mysql并使用datagrip远程连接

    火锅不要再吃啦: 感谢楼主,搞了好久终于连接上了!!

  • ubuntu安装mysql并使用datagrip远程连接

    2301_79149356: 牛啊。确实好用!!!

  • spring报错 XXX will not be managed by Spring

    cruboy: 控制台不断大量打印这个,怎么禁掉

  • ubuntu安装mysql并使用datagrip远程连接

    码农是我: 还是不行啊!虚拟机的ip是不是用ipconfing查询的,

  • nginx正向代理与反向代理

    有点建树: 解释得清楚!

大家在看

  • 毕设分享《基于java的客户管理系统的设计与实现》(源码+lw+解析等) 504
  • Uni-App基于微信小程序的公共浴池洗澡按摩系统
  • SEO新手入门指南:掌握这些技能,轻松提升网站排名!
  • 「C/C++」C++11 之 std::bitset 二进制数据处理模板库 715
  • 【MySQL】索引和事务 601

最新文章

  • 滑动窗口例题
  • 多源bfs
  • Redis面试
2023年82篇
2022年78篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值

玻璃钢生产厂家玻璃钢卡通雕塑生成厂家门头玻璃钢雕塑找哪家许昌玻璃钢雕塑设计九台区玻璃钢雕塑工程施工电话湖州玻璃钢仿铜雕塑厂家供应花盆玻璃钢雕塑长春玻璃钢雕塑生产厂家石家庄卡通雕塑玻璃钢商场美陈图片过年深圳玻璃钢雕塑销售厂商场美陈的意思商场美陈 雨伞沈阳欧式人物玻璃钢雕塑设计制作郑州不锈钢景观玻璃钢雕塑厂上海定制玻璃钢雕塑省钱四川卡通人物雕塑玻璃钢中山动物玻璃钢雕塑厂绵阳玻璃钢卡通雕塑厂家成都红色革命主题玻璃钢雕塑永康玻璃钢雕塑厂玻璃钢雕塑用在什么地方沈阳学校玻璃钢雕塑哪家便宜榆林frp玻璃钢雕塑厂家通渭玻璃钢雕塑报价镂空玻璃钢景观雕塑设计上海做玻璃钢雕塑生产厂家浙江环保玻璃钢雕塑优势太原佛像玻璃钢雕塑定做价格独特玻璃钢座椅雕塑河南景观玻璃钢雕塑供应商香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化