思路分析
代码
package com.atguigus.search;
import java.util.ArrayList;
import java.util.List;
public class BinarySearch {
public static void main(String[] args) {
int arr[] = {1,8,10,89,1000,1000,1000,1000,1000,1234};
int value = binarySearch(arr, 0, arr.length, 1000);
System.out.println("resIndex="+value); //resIndex=5
List<Integer> integers = binarySearch2(arr, 0, arr.length, 1000);
System.out.println("resIndex="+integers); //resIndex=[4, 5, 6, 7, 8]
}
/**
* 返回索引,只能返回一个
* @param arr 数组
* @param left 要查找的左边的位置
* @param right 要查找的右边的位置
* @param findVal 要查找的值
* @return
*/
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;
}
}
/**
* 查找索引 ,返回多个
* @param arr 数组
* @param left 左边索引位置
* @param right 右边索引位置
* @param findVal 查找的值
* @return
*/
public static List<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 {
// 处理 {1,2,2,2,2,2,3} -》 把中间左右两边的2的索引都是添加
List<Integer> resIndexList = new ArrayList<Integer>();
int temp = mid -1;
while (true){
if (temp < 0 || arr[temp] != findVal){
break;
}
//否则,就temp放入到resIndexlist
resIndexList.add(temp);
temp -=1 ; //temp 左移
}//添加mid的左边的那个
resIndexList.add(mid);//添加原本的mid的那个
temp = mid + 1;
while (true) {
if (temp > arr.length - 1 || arr[temp] != findVal) {
break;
}
resIndexList.add(temp);
temp += 1;
}//添加mid的右边的那个
return resIndexList;
}
}
}
运行结果
resIndex=5
resIndex=[4, 5, 6, 7, 8]