二分查找:
二分查找的前提必须是一个有序的数组
这里提供两个代码一个是查找一个值的一个下标,另一个是查找一个值的一组下标
/**
* 二分查找 注意:前提是该数组是有序的
* @param arr 查找的数组
* @param left 左边索引
* @param right 右边索引
* @param value 要查找的值
* @return 要查找的下标
*/
public static int binarySearch(int[] arr, int left, int right, int value) {
if (left > right) {
return -1;
}
//mid中值
int mid = (left + right) / 2;
int midValue = arr[mid];
if (value > midValue){
//向右递归
return binarySearch(arr, mid + 1, right, value);
}else if(value < midValue) {
//向左递归
return binarySearch(arr, left, mid -1, value);
}else {
return mid;
}
}
/**
* 二分查找 注意:前提是该数组是有序的
* @param arr 查找的数组
* @param left 左边索引
* @param right 右边索引
* @param value 要查找的值
* @return 要查找的下标list
*/
public static ArrayList lBinarySearch(int[] arr, int left, int right, int value) {
if (left > right) {
return new ArrayList<Integer>();
}
//mid中值
int mid = (left + right) / 2;
int midValue = arr[mid];
if (value > midValue){
//向右递归
return lBinarySearch(arr, mid + 1, right, value);
}else if(value < midValue) {
//向左递归
return lBinarySearch(arr, left, mid - 1, value);
}else {
ArrayList<Integer> al = new ArrayList<>();
int temp = mid - 1;
while (true){
if (temp < 0 || arr[temp] != value) {
break;
}
al.add(temp);
temp -= 1;
}
al.add(mid);
temp = mid + 1;
while (true){
if (temp > arr.length - 1 || arr[temp] != value) {
break;
}
al.add(temp);
temp += 1;
}
return al;
}
}