一、思路
- 首先确定该数组的中间的下标;
- 然后让需要查找的数findVal和arr[mid]比较;
2.1 findVal>arr[mid],说明要查找的数在mid的右边,因此需要递归地向右查找;
2.2 findVal<arr[mid],说明要查找的数在mid的左边,因此需要递归地向左查找;
2.3 findVal==arr[mid],找到,返回;
- 什么时候结束递归
3.1 找到结束递归;
3.2 递归完整个数组,仍然没有找到findVal,left>right时结束。
二、代码
public static int binarySearch(int[] arr, int left, int right, int findVal) {
if(left > right) {
return -1;
}
int mid = (left + right) / 2;
int midVal = arr[mid];
if(findVal > midVal) {
return binarySearch(arr, mid + 1, right, findVal);
}else if(findVal < midVal) {
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<Integer>();
}
int mid = (left + right) / 2;
int midVal = arr[mid];
if(findVal > midVal) {
return binarySearch2(arr, mid + 1, right, findVal);
}else if(findVal < midVal) {
return binarySearch2(arr, left, mid - 1, findVal);
}else {
ArrayList<Integer> resIndexList = new ArrayList<>();
int temp = mid - 1;
while (true) {
if(temp < 0 || arr[temp] != findVal) {
break;
}
resIndexList.add(temp);
temp -= 1;
}
resIndexList.add(mid);
temp = mid + 1;
while (true) {
if(temp > arr.length - 1 || arr[temp] != findVal) {
break;
}
resIndexList.add(temp);
temp += 1;
}
return resIndexList;
}
}