二分法最常用的两种模板
1.所查值可以不在数组中
这种情况对应的是新给一个数插入有序数组中(一维或多维都可以,如leetcode74),或找和它差值最小的数等等。
思路是最后保留两个数,再做比较。
//模板1 假设 target是所查值,list是数组
let left = 0,right = length;
while(left<right){
let mid = (left+right)>>>1;
if(target > list[mid]) left = mid + 1;
else if(target < list[mid]) right = mid;
else return mid; //相等,则找到了
}
//终止条件 left == right
比较right-1和right的值哪个符合,返回即可。
2.所查值必须在数组中
这里就不需要最后一步的判断过程,直接选出一个即可
//模板2 假设 target是所查值,list是数组
let left = 0,right = length-1;
while(left<=right){
let mid = (left+right)>>>1;
if(target > list[mid]) left = mid + 1;
else if(target < list[mid]) right = mid - 1;
else return mid; //相等,则找到了
}
//终止条件 left>right
return left;