二分查找

思路:
1.首先确定该数组中间的下标
mid = (left + right) / 2
2.然后让需要查找的数findval和arr[mid]比较
2.1 如果findVal > arr[mid],说明你要查找的数在mid的右边,因此 需要递归的向右查找。
2.2 如果findVal < arr[mid],说明你要查找的数在mid的左边,因此 需要递归的向左查找。
2.3 如果findVal = arr[mid],就返回。

思考:什么时候需要结束递归
1)找到就结束递归
2)递归完整个数组仍然没有找到findVal,也需要结束递归,当left > right就需要 退出

 

 1 public static int  binarySearch(int[] arr, int left, int right, int findVal) {
 2         if(left > right) {
 3             return -1;
 4         }
 5         int mid = (left + right) / 2;
 6         int midVal = arr[mid];
 7         if(findVal > midVal) {  // 向右递归查询
 8             return binarySearch(arr, mid + 1, right, findVal);
 9         } else if (findVal < midVal) {  // 向左递归查询
10             return binarySearch(arr, left,mid + 1, findVal);
11         } else {
12             return mid; // 刚好中间一个 就是
13         }
14     }

思考这样一个问题:如果查找的数有多个,又如何?

我们只需要将匹配的数的下标装进数组里面

 1 // 代码优化,当有多个数值的时候
 2     public static ArrayList<Integer> binarySearch1 (int[] arr, int left, int right, int  findVal) {
 3         if(left > right) {
 4             return new ArrayList<>();
 5         }
 6         int mid = (left + right) / 2;
 7         int midVal = arr[mid];
 8         if(findVal > midVal) { // 向右递归查询
 9             return binarySearch1(arr, mid + 1, right, findVal);
10         } else if (findVal < midVal) { // 向左递归查询
11             return binarySearch1(arr, left, mid - 1, findVal);
12         } else { // 刚好等于的这个情况,左右查找
13             ArrayList<Integer> resArrayList = new ArrayList<Integer>();
14             int temp = mid -1; // 向左查找
15             while (true) {
16                 if(arr[temp] != findVal || temp < 0) {    // 错误1:把arr[temp]写成arr[mid]
17                     break;
18                 }
19                 resArrayList.add(temp); // 把当前下标加到数组
20                 temp--; // 向左移继续找
21             }
22 
23             resArrayList.add(mid);
24 
25             temp = mid + 1; // 向右查找
26             while (true) {
27                 if(arr[temp] != findVal || temp > arr.length - 1) {    // 错误二:这里写成arr.length + 1;
28                     break;
29                 }
30                 resArrayList.add(temp); // 把当前下标加到数组
31                 temp++; // 向右移继续找
32             }
33 
34             return resArrayList;
35 
36         }
37 
38     }

 

posted on 2021-03-22 09:22  Love&Share  阅读(36)  评论(0编辑  收藏  举报

导航