认识二分法--二分的4道题

635 阅读1分钟
  1. 在一个有序数组中,找到某个数是否存在
public static int binarySearch(int[] arr, int target) {
    if (arr == null || arr.length == 0) {
        return -1;
    }
    int L = 0;
    int R = arr.length - 1;
    while (L <= R) {
        int mid = L + ((R - L)>>1);
        System.out.println("L:"+L+",R:"+R+",mid:"+mid+",value:"+arr[mid]);
        if (arr[mid] == target) {
            return mid;
        } else if (arr[mid] > target) {
            R = mid - 1;
        } else {
            L = mid + 1;
        }
    }
    return -1;
}
  1. 在一个有序数组中,找>=某个数最左侧的位置
//找出>=target 最左位置
public static int nearestLeftIndex(int[] arr, int target) {
    int L = 0;
    int R = arr.length - 1;
    int index = -1;//记录>=最左侧的位置
    while (L <= R) {
        int mid = L + ((R - L)>>1);
        if (arr[mid] >= target) {//找>=target的位置,满足条件就更新index位置值
            index = mid;
            R = mid - 1;
        } else {
            L = mid + 1;
        }
    }
    return index;
}
  1. 在一个有序数组中,找<=某个数最右侧的位置
//找出<= target 最右位置
public static int nearestRightIndex(int[] arr, int target) {
    int L = 0;
    int R = arr.length - 1;
    int index = -1;//记录<=最右侧的位置
    while (L <= R) {
        int mid = L + ((R - L)>>1);
        if (arr[mid] <= target) {//找<=target的位置,满足条件就更新index位置值
            index = mid;
            L = mid + 1;
        } else {
            R = mid - 1;
        }
    }
    return index;
}

4.局部最小
局部最小定于:

  1. 0位置的数,如果比1位置的数小则0位置的数是局部最小
  2. N位置的数,如果比N-1位置的数小则N位置的数是局部最小
  3. i位置的数,比i-1和i+1位置的数都小则i位置的数局部最小 数组无序,且任意相邻的两个数都不相等,找出任一一个局部最小值
public static 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 left = 1;
    int right = arr.length - 2;
    int mid = 0;
    while (left < right) {
        mid = (left + right) / 2;
        if (arr[mid] > arr[mid - 1]) {
            right = mid - 1;
        } else if (arr[mid] > arr[mid + 1]) {
            left = mid + 1;
        } else {
            return mid;
        }
    }
    return -1;
}

找到可以排除一半不符合的值并保持逻辑正确就可以用二分。