可以查找重复相同的数

    1. package com.atguigu.search;
    2. import java.util.ArrayList;
    3. import java.util.List;
    4. /**
    5. * 二分查找法
    6. * @author Dxkstart
    7. * @create 2021-10-13-14:57
    8. */
    9. public class BinarySearch {
    10. public static void main(String[] args) {
    11. //注意:使用二分查找的前提是,该数组是有序的。
    12. int[] arr = {1,8,10,89,1000,1000,1000,1000,1234};
    13. List<Integer> list = binarySearch2(arr, 0, arr.length - 1, 1000);
    14. System.out.println(list);
    15. }
    16. /*
    17. {1,8, 10, 89, 1000, 1000,1000,1234}
    18. 当一个有序数组中,有多个相同的数值时,
    19. 如何将所有的数值都查找到,比如这里的 1000.
    20. 思路分析:
    21. 1.在找到 mid 索引值,不要马上返回
    22. 2.向mid 索引值的左边扫描,将所有满足1000,的元素的下标,加入到集合ArrayList
    23. 3.向mid 索引值的右边扫描,将所有满足1000,的元素的下标,加入到集合ArrayList
    24. 4.将ArrayList返回
    25. */
    26. //完善二分查找
    27. public static List<Integer> binarySearch2(int[] arr,int left,int right,int findVal){
    28. //当left > right 时,说明递归整个数组,但是没有找到
    29. if (left > right){
    30. return new ArrayList<Integer>();
    31. }
    32. int mid = (left + right) / 2;
    33. int midVal = arr[mid];
    34. if (findVal > midVal){//需要向右递归
    35. return binarySearch2(arr,mid + 1,right,findVal);
    36. }else if (findVal < midVal){//需要向左递归
    37. return binarySearch2(arr,left,mid - 1,findVal);
    38. }else {//找到了
    39. List<Integer> resIndexList = new ArrayList<>();
    40. resIndexList.add(mid);//先将找到结果的放入集合中
    41. //向mid 索引值的左边扫描,将所有满足1000,的元素的下标,加入到集合ArrayList
    42. int temp = mid - 1;
    43. while (true){
    44. if (temp < 0 || arr[temp] != findVal){
    45. break;
    46. }else {
    47. //否则就将temp当入到resIndexList中
    48. resIndexList.add(temp);
    49. temp--;
    50. }
    51. }
    52. //向mid 索引值的左边扫描,将所有满足1000,的元素的下标,加入到集合ArrayList
    53. temp = mid + 1;
    54. while (true){
    55. if (temp > arr.length - 1 || arr[temp] != findVal){
    56. break;
    57. }else {
    58. resIndexList.add(temp);
    59. temp++;
    60. }
    61. }
    62. return resIndexList;
    63. }
    64. }
    65. }