文章目录
二分查找
要求:
有序数组找目标数位置
思路:
经典二分思想
代码:
public static int find(int[] arr,int target,int left,int right){
while(left<= right){//注意这里是<=
int mid = left+(right-left)/2;
if (arr[mid]<target) left = mid+1;
else if (arr[mid]>target) right = mid-1;
else return mid;
}
return -1;//找不到输出-1
}
二分查找最左/有边界
要求:
查找有序数组相同数字的左边界,如1 2 3 3 3 3 4,获得左边界为2,右边界为5
思路:
和二分查找差不多,但是,在找到目标数字时尽可能左靠或右靠
代码:
int getL(int[] arr,int k,int left,int right){
int mid;
while(left<=right){
mid = (left+right)/2;
if(k<=arr[mid]){//尽可能靠左取值
right = mid-1;
}else{
left = mid+1;
}
}
return left;
}
int getR(int[] arr,int k,int left,int right){
int mid;
while(left<=right){
mid = (left+right)/2;
if(k>=arr[mid]){//尽可能靠右取值
left = mid+1;
}else{
right = mid-1;
}
}
return right;
}