1.设计思路
当找到第一个满足条件时,向左遍历,找到满足条件的就添加到集合;然后将mid添加;最后向右遍历,找到满足条件的就添加到集合;最后返回这个集合。
2.代码实现
package binarySearchManyNumber;
import java.util.ArrayList;
import java.util.Scanner;
public class main {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
int[] Array = {3, 4, 5, 6, 7, 8, 9, 9, 9};
System.out.println("请输入你要查询的数:");
int num = s.nextInt();
ArrayList<Integer> index = binarySearch(Array, 0, Array.length - 1, num);
System.out.println(num + "的索引为:" +index);
}
/**
* 二分查找算法
*
* @param array 数组
* @param left 左指针
* @param right 右指针
* @param key 要查找的值
* @return 如果数组中存在多个目标值,则返回一个集合
*/
public static ArrayList<Integer> binarySearch(int[] array, int left, int right, int key) {
// 查找失败
if (left > right) {
return new ArrayList<Integer>();
}
int mid = (left + right) / 2; // 中间值的下标
int midKey = array[mid]; // 中间值
// 如果大于中间值,则向右递归
if (key > midKey) {
return binarySearch(array, mid + 1, right, key);
} else if (key < midKey) { // 否则,向左递归
return binarySearch(array, left, mid - 1, key);
} else {
// 向索引为mid的左边查找满足条件的值的索引,并添加到集合中
ArrayList<Integer> o = new ArrayList<Integer>();
int temp_left = mid - 1;
while (true) {
if (temp_left < 0 || array[temp_left] != key) {
break;
}
o.add(temp_left);
// 向左扫描
temp_left --;
}
// 将索引为mid添加到集合中
o.add(mid);
// 向索引为mid的右边查找满足条件的值的索引,并添加到集合中
int temp_right = mid + 1;
while (true) {
if (temp_right > array.length - 1 || array[temp_right] != key) {
break;
}
o.add(temp_right);
// 向右扫描
temp_right++;
}
return o;
}
}
}
版权声明:本文为qq_37126995原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。