二分查找

一、在一个有序数组中,查找某个数是否存在,时间复杂度O(logN)

  这个基本的二分查找中有一个缺陷,在一些有重复元素的数组中,比如[1,2,2,2,3,3,4],这个数组中,假设我们查找2这个元素,我们会直接返回下标3,如果要寻找最左侧的数,显然不符合了。

 public static int binarySearch(int[] arr, int num) {
        int left = 0;
        int right = arr.length - 1;  // 确定搜索区间是:[0, len-1]
        while (left <= right) {      // 这里如果是<, 相等情况下[3,3],这种情况将不会被考虑,或者最后;return arr[left] == num ? left, -1
            int mid = left + ((right - left) >> 1);  // (left + right) / 2 || left + (right - left) / 2
            if (arr[mid] == num) return mid;
            else if (arr[mid] > num) {
                right = mid - 1;
            } else if (arr[mid] < num) {
                left = mid + 1;
            }
        }
        return -1;
    }

 

二、在一个有序数组中,找>=某个数最左侧位置,或者<=某个数最右侧位置

 

 

posted @ 2021-12-03 12:04  Shydow  阅读(24)  评论(0编辑  收藏  举报