查找算法中重复值的问题
如何改进查找算法中重复值只能找到一个就结束的问题?
思路如下:
1.创建集合,当查找到第一个值的时候,先不要返回,将这个值加入集合中去;
2.在这个值的两边分别进行查找,找到剩余的值,加入集合;
3.返回集合
以改进的二分查找算法为例:
package com.chen.reserach;
import java.util.ArrayList;
import java.util.List;
public class BinarySerach {
public static void main(String[] args) {
int[] arr = {1,2,3,4,5,5,6,6,7,7,7,8,8,8,8,8};
ArrayList<Integer> list = binaryserach(arr, 0, arr.length - 1, 6);
System.out.println("list = "+list);//list里面是对应数值下标的集合
}
public static ArrayList<Integer> binaryserach(int[] arr, int left, int right, int findVal){
int mid = (left+right)/2;
int midVal =arr[mid];
//遍历完了整个数组
if (left>right){
throw new RuntimeException("没有找到值");
}
if (findVal>midVal){
binaryserach(arr,mid+1,right,findVal);
}
if (findVal<midVal){
binaryserach(arr,left,mid-1,findVal);
}
else {
//这个时候mid就是要寻找的值的位置
//当找到第一个值的时候不要直接返回,先存起来,然后找下一个
ArrayList<Integer> list = new ArrayList<>();
//向mid的左边进行扫描,找到余下的值
int temp = mid- 1;
while (true){
//因为数组是有序的,所以相等的值,必在mid的左右
if (temp<0||arr[temp]!=findVal){
break;
}
list.add(temp);
temp-=1;
}
list.add(mid);
//反之,向右进行扫描
temp = mid+1;
while (true){
//因为数组是有序的,所以相等的值,必在mid的左右
if (temp>arr.length-1||arr[temp]!=findVal){
break;
}
list.add(temp);
temp+=1;
}
//扫描完毕
return list;
}
return null;
}
}