二分查找在有序数组中是一个非常低成本的查找方法,但是不对二分查找十分的熟悉很难对不同的需求快速写出不同的边界判断和边界返回。
1.二分查找中的下中位数
median = (length - 1) / 2
2.模板分析
由于需求前变万化,我个人推荐固定(l<r)的判别。
而对于l指针和r指针的理解:
对于搜索过程中, high 位置的作用是减少搜索空间而 low 的作用是从0开始一直向着目标数字前进
搜索到的时候返回它,是一个一直逼近的过程。
对此对于高位的操作就可以放心惹
对于变种的题,只需找到目标位置与left位置关系即可。
那么对于不同的需求,只要在return中进行不同的判断即可。
以下代码的区别仅仅是=的位置不同
function upperInsert(target){
let l=0;
let r=stones.length-1;
while(l<r){
let m=Math.floor((l+r)/2);
if(target<stones[m]){
r=m;
}else if(target>=stones[m]){
l=m+1;
}
}
return target>stones[l]?l+1:l;;
//关键,相等或者大于都推进l,最后的判断是为了将结果插到末位(因为超过r了)
}
function lowerInsert(arr,target){
let l=0;
let r=arr.length-1;
while(l<r){
let m=Math.floor((l+r)/2);
if(target<=arr[m]){
r=m;
}else if(target>arr[m]){
l=m+1;
}
}
//if(nums[l]!=target) return -1;
//判断原数组中没有target的情况,不判断也行,就是返回插入位置
return target>arr[l]?l+1:l;;
//同样插入到最末尾要判断超r的情况
}