package datastructure.binarysearch;
import java.util.ArrayList;
public class BinarySearch {
public static void main(String[] args) {
int[] array = {1,3,4,5,6,7,7,8,23,34,100, 100};
ArrayList<Integer> i = binarySearch2(array, 0, array.length - 1, 7);
System.out.println(i);
}
/**
*
* @param arr 数组
* @param left 左边索引
* @param right 右遍索引
* @param target 要查找的数
* @return 返回查找数的索引, 没找到返回null
*/
//可以返回重复数字的索引
public static ArrayList<Integer> binarySearch2(int[] arr, int left, int right, int target) {
int mid = (left + right) / 2;
if(left > right) {//这里一定要是大于
return null;
}
if(target > arr[mid]) {
return binarySearch2(arr, mid + 1, right, target);
}else if(target < arr[mid]) {
return binarySearch2(arr, left, mid - 1, target);
}else {
//找到不要急着返回,可以看看mid的左边和右遍是否还有与target相等的数
ArrayList<Integer> list = new ArrayList<>();//创建一个集合来保存索引
int a = mid - 1;//向左边寻找的索引
int b = mid + 1;//向右边寻找的索引
while (a >= left && target == arr[a]){//保证不越界和等于target的数的索引才能放进集合
list.add(a);
a--;
}
list.add(mid);//因为arr[mid]和target相等,可以先放进去
while (b <= right && target == arr[b]){
list.add(b);
b++;
}
return list;
}
}
}