package com.hao.firstdemo.datastruct.search;
import java.util.ArrayList;
/**
* @author haoxiansheng
* @data 2020/5/9 20:20
*/
public class BinarySearch {
public static void main(String[] args) {
int arr[] = {1, 2, 3, 4, 52, 99, 99};
int res = binarySearch(arr, 0, arr.length-1, 99);
System.out.println(res);
ArrayList<Integer> resultIndex = binarySearch2(arr, 0, arr.length-1, 99);
System.out.println(resultIndex);
}
/**
* 二分查找前提的有序
*
* @param arr 查找的集合
* @param left 左边的索引
* @param right 右边的索引
* @param findVal 查找的值
* @return 如果找到返回下标 没有找到返回-1
*/
public static int binarySearch(int[] arr, int left, int right, int findVal) {
if (left > right) { // 说明递归整个数组还是没有找到
return -1;
}
int mid = (left + right) / 2;
int midValue = arr[mid];
if (findVal > midValue) { // 大于向右递归
return binarySearch(arr, mid + 1, right, findVal);
} else if (findVal < midValue) {
return binarySearch(arr, left, mid - 1, findVal);
} else {
return mid;
}
}
// 上面的扩展找到所有
public static ArrayList<Integer> binarySearch2(int[] arr, int left, int right, int findVal) {
if (left > right) { // 说明递归整个数组还是没有找到
return new ArrayList<>();
}
int mid = (left + right) / 2;
int midValue = arr[mid];
if (findVal > midValue) { // 大于向右递归
return binarySearch2(arr, mid + 1, right, findVal);
} else if (findVal < midValue) {
return binarySearch2(arr, left, mid - 1, findVal);
} else {
ArrayList<Integer> results = new ArrayList<>();
int temp = mid -1;
// 向左扫描
while (true ){
if (temp < 0 || arr[temp] != findVal) { // 退出
break;
}
// 否则, 就temp 放入到results中
results.add(temp);
temp -= 1; // temp 左移
}
results.add(mid);
// 向右扫描
temp = mid +1;
while (true) {
if (temp > arr.length-1 || arr[temp] != findVal) { // 退出
break;
}
// 否则, 就temp 放入到results中
results.add(temp);
temp += 1; // temp 右移
}
return results;
}
}
}