1.寻找一个数(简单的二叉搜索)
搜索一个数,如果存在,返回其索引,否则返回 -1。
public static int binarySearch(int[] arr,int target) {
int left = 0;
int right = arr.length-1;
while(left<=right) {
int mid = left + ((right-left)>>1);
if(arr[mid]==target) {
return mid;
}else if(arr[mid]<target) {
left = mid + 1;
}else if(arr[mid]>target) {
right = mid-1;
}
}
return -1;
}
但存在一个缺点,比如说给你有序数组 nums = [1,2,2,2,3]
,target
为 2,此算法返回的索引是 2,没错。但是如果我想得到 target
的左侧边界,即索引 1,或者我想得到 target
的右侧边界,即索引 3,这样的话此算法是无法处理的。
2.查找一个数的左边界
public static int left_Bound(int[] arr,int target) {
int left = 0;
int right = arr.length-1;
while(left<=right) {
// 查找中间值
int mid = left + ((right-left)>>1);
if(arr[mid]>target) {
right = mid -1;
}else if(arr[mid]<target) {
left = mid + 1;
}else if(arr[mid]==target) {
// 控制边界
right = mid-1;
}
}
// 判断
if(left>=arr.length||arr[left]!=target) {
return -1;
}
return left;
}
3.查找一个数的右边界
public static int left_Bound(int[] arr,int target) {
int left = 0;
int right = arr.length-1;
while(left<=right) {
// 查找中间值
int mid = left + ((right-left)>>1);
if(arr[mid]>target) {
right = mid -1;
}else if(arr[mid]<target) {
left = mid + 1;
}else if(arr[mid]==target) {
// 控制边界
right = mid-1;
}
}
// 判断
if(left>=arr.length||arr[left]!=target) {
return -1;
}
return left;
}