二分查找的mid值确定以及check函数的确定
创始人
2024-05-30 15:08:05
0

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;}
}

力扣有一道经典题目:

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;}}
}

相关内容

热门资讯

安卓原生系统时间校准,基于安卓... 手机时间不准了?别急,我来教你如何轻松搞定安卓原生系统时间校准! 话题引入:手机时间不准,是不是让你...
主机系统内存和安卓联机,主机系... 你有没有想过,为什么你的手机在玩大型游戏时总是卡得要命?又或者,为什么你的电脑在处理复杂任务时,反应...
安卓如何手机上刷系统,轻松升级... 你有没有想过,你的安卓手机是不是已经有点儿“老态龙钟”了呢?别急,别急,今天就来教你怎么给它来个“青...
苹果系统观战安卓好友,观战新体... 亲爱的读者,你是否也有过这样的经历:一边享受着苹果系统的优雅与流畅,一边又忍不住好奇地观战安卓好友们...
安卓系统最好是哪个,最佳生成方... 你有没有想过,手机里的安卓系统哪个才是最适合你的呢?在这个信息爆炸的时代,手机已经成为了我们生活中不...
改时间安卓系统vivo,探索v... 你有没有发现,最近你的vivo手机有点儿“慢吞吞”的?别急,别急,让我来给你支个招儿,让你的安卓系统...
安卓系统的旋钮在哪,旋钮生成位... 你有没有发现,有时候手机上的小细节也能让人头疼不已?比如说,安卓系统的旋钮在哪?这问题看似简单,但不...
安卓手机app系统软件,探索安... 你有没有发现,现在手机里的app简直就像是个小宇宙,各种功能应有尽有,让人眼花缭乱。尤其是安卓手机,...
win111安卓子系统,开启跨... 哇,你有没有听说最近的大新闻?那就是Windows 11的安卓子系统!是的,你没听错,Windows...
游戏摇杆连安卓系统电视,畅享游... 你有没有想过,家里的安卓系统电视也能玩起游戏来?没错,就是那种让你手舞足蹈、热血沸腾的游戏摇杆!今天...
nokia平板系统兼容安卓,尽... 你有没有想过,那些曾经陪伴我们度过无数时光的诺基亚手机,现在竟然也能摇身一变,成为平板电脑的得力助手...
安卓原生系统是什么品牌,探索安... 你有没有想过,为什么你的手机那么流畅,界面那么美观?这背后,可是有一个强大的“大脑”在默默支撑着呢!...
安卓3大操作系统,从三大分支看... 你知道吗?在安卓的世界里,操作系统可是有着三大巨头呢!它们就像安卓世界的三驾马车,各自有着独特的魅力...
开源文件管理系统安卓,打造个性... 你有没有想过,手机里那些乱糟糟的文件,要是能有个好帮手,生活该有多轻松啊?今天,就让我带你走进一个神...
手机删除了系统安卓市场,手机系... 手机里的安卓市场突然不见了,这可怎么办呢?别急,让我来给你详细说说这个棘手的问题,让你轻松应对!一、...
安卓系统写脚本软件下载,基于安... 你有没有想过,你的安卓手机或者平板电脑,除了用来刷剧、玩游戏,还能变成一个强大的工作助手呢?没错,就...
安卓系统有哪些机型好,探索顶级... 你有没有想过,安卓系统里的手机型号那么多,哪一款才是最适合你的呢?别急,今天我就来给你好好盘点看看安...
安卓系统之间如何互传,安卓设备... 你是不是也和我一样,手机里存了那么多好东西,却苦于不能和好友分享呢?别急,今天就来教你怎么用安卓系统...
安卓系统启动修改工具,安卓系统... 你有没有想过,你的安卓手机启动速度竟然可以像火箭一样快?没错,这就是今天我要跟你分享的神秘工具——安...
安卓系统版本号历史,从初生到繁... 你有没有发现,每次打开手机,那系统版本号总是一闪而过,好像在悄悄告诉你:“我可是有故事的哦!”今天,...