一、找到(只能返回1个索引)的情况:
没有找到的情况:
总结:1.这个数组需要事先排好序才能进行
2.根据目标数与arr[mid]大小情况来判断递归的方向
3.终止递归的条件:
3.1:找到了对应数。返回mid就行
3.2:查无此数。left>right出现
代码实现:
/**
*
* @param array:待查找的数组
* @param target:目标数
* @param left:左索引
* @param right:右索引
* 如果找到返回下标,没有找到就返回-1
*/
public static int binarySearch(int[] array,int target,int left,int right){
//left>right时递归结束,没找到对应值
if (left>right){
return -1;
}
//定义中间数的索引
int mid = (left + right) / 2;
if (target == array[mid]){
return mid;
}else if (target < array[mid]){//满足了向左递归的情况
return binarySearch(array,target,left,mid-1);
} else {//向右递归
return binarySearch(array,target,mid+1,right);
}
}
二、找到(能返回多个索引)的情况:
如果我们要找的数组中存在多个目标数,我们可以拿一个集合ArrayList<Integer>记录所有索引。
稍微改动一下数组的数字:
代码实现:
public static ArrayList<Integer> binarySearch2(int[] array, int target, int left, int right){
//left>right时递归结束,没找到对应值
if (left>right){
return new ArrayList<Integer>();
}
//定义中间数的索引
int mid = (left + right) / 2;
if (target == array[mid]){
ArrayList<Integer> list = new ArrayList<>();
//如果找到了这个数字,分别向他的左边右边寻找还有无相同的数
list.add(mid);
//向左边
int lTemp = mid - 1;
while (true){
if (lTemp < 0 || array[lTemp] != target){//只会连着出现,因为是排序了
break;//这样就是没出现
}
list.add(lTemp--);//ltemp左移
}
//向左边
int rTemp = mid + 1;
while (true){
if (lTemp > array.length-1 || array[rTemp] != target){//只会连着出现,因为是排序了
break;//这样就是没出现
}
list.add(rTemp++);//rtemp右移
}
return list;
}else if (target < array[mid]){//满足了向左递归的情况
return binarySearch2(array,target,left,mid-1);
} else {//向右递归
return binarySearch2(array,target,mid+1,right);
}
}
只需要在找到目标数的部分做对应修改就好,其余的大致一样。