二分查找
思路:
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) 编辑 收藏 举报