算法学习笔记——二分查找
- 普通二分查找(找到key,返回索引,否则返回-1)
public static int normal_binaryfind(int[] arr,int key,int left,int right){
int mid;
//搜索区间是[left,right]
while(left<=right){
mid=left+(right-left)/2;
if(arr[mid]==key)return mid;
else if(arr[mid]<key)left=mid+1;
else if(arr[mid]>key)right=mid-1;
}
return -1;
}
- 左边界收缩二分查找(找到key,返回第一个的索引;否则返回-1(越界)或第一个比key大的数的索引)
public static int left_binaryfind(int[] arr,int key,int left,int right){
int mid;
//搜索区间是[left,right];
while(left<=right){
mid=left+(right-left)/2;
if(arr[mid]==key)right=mid-1;
else if(arr[mid]<key)left=mid+1;
else if(arr[mid]>key)right=mid-1;
}
if(left>=arr.length)
return -1;
return left;//1.命中key:返回key最靠左的坐标
//2.未命中key:返回第一个比key大的坐标
}
- 右边界收缩二分查找(找到key,返回最后一个的索引;否者返回-1(越界)或最后一个比key小的数的索引)
public static int right_binaryfind(int[] arr,int key,int left,int right){
int mid;'
//搜索区间是[left,right];
while(left<=right){
mid=left+(right-left)/2;
if(arr[mid]==key)left=mid+1;
else if(arr[mid]<key)left=mid+1;
else if(arr[mid]>key)right=mid-1;
}
if(right<0)
return -1;
return right;//1.命中key:返回key最靠右的坐标
//2.未命中key:返回最后一个比key小的坐标
}
注意while中的语句都是left<=right,即操作区间是左闭右闭[left,right],结束条件是left==right+1。