算法-02 二分查找

1 认识二分查找

  1. 在顺序的数组中,每次查询查到中间值进行比对
  2. 查询值若大于该值,则左边界在当前位置+1
  3. 查询值若小于该值,则右边界在当前位置-1
  4. 直到找到该值,左边界大于右边界时

2 基本二分查找代码

boolean exist(int[] sortedArr, int value) {
    if (sortedArr == null || sortedArr.length == 0) {
        return false;
    }
    int L = 0;
    int R = sortedArr.length - 1;
    int mid = 0;
    while (L < R) {
        mid = L + ((R - L) >> 1); // mid = (L + R) / 2
        if (value > sortedArr[mid]) {
            L = mid + 1;
        } else if (value < sortedArr[mid]) {
            R = mid - 1;
        } else {
            return true;
        }
    }
    return sortedArr[L] == value;
}

3 适用于二分查找无序数组的题目

3.1 在数组中找出 >= value 最左边位置

int nearestIndex(int[] arr, int value) {
    int L = 0;
    int R = arr.length - 1;
    int index = -1;
    while (L <= R) {
        int mid = L + ((R - L) >> 1);
        if (arr[mid] >= value) {
            index = mid;
            R = mid - 1;
        } else {
            L = mid + 1;
        }
    }
    return index;
}

3.2 在数组中找出 <= value 最右边位置

int nearestIndex(int[] arr, int value) {
    int L = 0;
    int R = arr.length - 1;
    int index = -1;
    while (L <= R) {
        int mid = L + ((R - L) >> 1);
        if (arr[mid] <= value) {
            index = mid;
            L = mid + 1;
        } else {
            R = mid - 1;
        }
    }
    return index;
}

3.3 在数组中找出一个局部最小数

int getLessIndex(int[] arr) {
    if (arr == null || arr.length == 0) {
        return -1;
    }
    if (arr.length == 1 || arr[0] < arr[1]) {
        return 0;
    }
    if (arr[arr.length - 1] < arr[arr.length - 2]) {
        return arr.length - 1;
    }
    int L = 1;
    int R = arr.length - 2;
    while (L < R) {
        int mid = L + ((R - L) >> 1);
        if (arr[mid] > arr[mid-1]) {
            R = mid - 1;
        } else if (arr[mid] > arr[mid+1]) {
            L = mid + 1;
        } else {
            return mid;
        }
    }
    return L;
}

你可能感兴趣的:(算法,算法,数据结构,java)