第 150 题:二分查找如何定位左边界和右边界
不使用 JS 数组 API,查找有序数列最先出现的位置和最后出现的位置。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
不使用 JS 数组 API,查找有序数列最先出现的位置和最后出现的位置。
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(14)
稍微对二分查找改造一下就可以,找到目标值之后左右滑动确定值
findRight 应当返回left - 1
[leftIndex, rightIndex)
左闭右开区间,区间的选择会影响终止条件的判断midIndex = Math.floor((4 + 5) / 2) = 4
,符合预期leftIndex == rightIndex
时,区间[leftIndex, rightIndex)
无法匹配任何值,终止循环/递归[leftIndex, midIndex)
并记录firstIndex
,重复直到达到终止条件[midIndex + 1, rightIndex)
并记录lastIndex
,重复直到达到终止条件递归实现
循环实现:
测试:
题目介绍
二分查找定位左边界和右边界
knuth 说过,二分查找虽然思路很简单,但是细节是魔鬼。
通常,我会根据$[left, right]$ 和 $[left,right)$ 来分类各种不同的写法。
并且个人更喜欢第二种,而且 $[left, right)$ 也是 C++ stl 中 lower_bound 和 upper_bound 中的使用方法。
function twoY(arr,str){
var lf=0,rt=arr.length-1,larr,rarr;
while(rt>=lf){
larr=arr[lf],rarr=arr[rt];
if(larr===str && rarr===str||larr==666&&rarr===str||rarr==666&&larr===str){
console.log(lf, rt);
break;
}else if(larr===str&&larr!=666&&rarr!=666){
larr=666;rt--;
}else if(rarr===str&&rarr!=666&&larr!=666){
rarr=666;lf++;
}else if(larr==666&&rarr!==str){
rt--;
}else if(rarr==666&&larr!==str){
lf++;
}else{
rt--;
lf++;
}
}
}
var aa =[1,8,2,3,4,5,11,6,7,8,9,3,2,3];
twoY(aa,11);
我老了,脑子不是特别好使,瞎jb写的,写的我脑子好难受。
二分查找基础代码
掘金-神三元的解析: https://juejin.im/post/5d8f6856e51d45784227aca6
详解:https://juejin.im/post/5dd4c4ce6fb9a020350a8c54