在如果在集合中要查找的元素有重复,二分查找只能查找到一个下标,此变种可以查找重复元素第一次出现的下标和最后一次出现的下标:
/**
* @author mojiayi
* @date 2019-04-04 23:00
* 二分查找变种:查找指定元素的范围:floor 和 ceil
*/
public class BinarySearcha {
/**
* @Author: Alpha Li
* @Paramter:
* @ReturnType:
* @Description: 找出第一个符合的下标
* @Datetime: 2019/4/4
*/
public static int searchFloor(int[] arr, int tar){
int l = 0, r = arr.length - 1;
while(l <= r){
int mid = l + (r - l)/2;
if(arr[mid] >= tar)
r = mid - 1;
else
l = mid + 1;
}
if(l < arr.length && arr[l] == tar)
return l;
return -1;
}
/**
* @Author: Alpha Li
* @Paramter:
* @ReturnType:
* @Description: 找出最后一个符合的下标
* @Datetime: 2019/4/4
*/
public static int searchCeil(int[] arr, int tar){
int l = 0, r = arr.length - 1;
while(l <= r){
int mid = l + (r - l)/2;
if(arr[mid] <= tar)
l = mid + 1;
else
r = mid - 1;
}
if(r >= 0 && arr[r] == tar)
return r;
return -1;
}
public static void main(String[] args) {
int[] arr = {1,2,3,4,5,5,5,6,7,8,8,8,9};
System.out.println(searchCeil(arr, 5));
}
}