二分查找:
二分查找的前提必須是一個有序的數組
這裏提供兩個代碼一個是查找一個值的一個下標,另一個是查找一個值的一組下標
/**
* 二分查找 注意:前提是該數組是有序的
* @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;
}
}