(1)二分查找使用条件:有限有序的数组
(2) 我们要尽可能争取低时间复杂度求解问题,当我们要把时间复杂度由O(n)降为O(logn)时,要想到二分,比如平方根
69. x 的平方根 - 力扣(LeetCode) (leetcode-cn.com)
(3)数组中查找一个数的下标
注意查询区间跟跳出循环的条件时对应的,可以是左开右闭(right=array.length)与left<right
public int binarySearch(int[] array,int target){
int left=0;
int right=array.length-1;//查询区间是[left,right]
while(left<=right){//跳出时left=middle+1
int middle=left+(right-left)/2;//防止溢出
if(array[middle]==target){
return middle;
}else if(array[middle]>target){
right=middle-1;
}else{
left=middle+1;
}
}
return -1;
}
(4)数组中查找一个重复数字的左边界(右边界同理)
注意收缩右侧边界以及结束时有效判断
最后left如果有效则一定是左侧边界(数学证明略)
巧记:返回谁最后判断谁(是否数组越界以及是否相等)
public int binarySearch(int[] array,int target){
int left=0;
int right=array.length-1;
while(left<=right){//跳出循环时,left=right+1
int middle=left+(right-left)/2;
if(array[middle]==target){
right=middle-1;//并不立刻返回,收缩右侧边界,右边界left=middle+1
}else if(array[middle]>target){
right=middle-1;
}else{
left=middle+1;
}
}
if(left>=array.length||array[left]!=target){//右边界right<0||array[right]!=target
return -1;
}
return left;//右边界返回right
}