3、关于二分查找的题目

112 阅读1分钟

1、在一个有序数组中,找某个数是否存在

public static boolean exist(int[] arr, int num) {
//        判断不成立的条件
        if (arr == null || arr.length == 0) {
            return false;
        }
//        定义边界
        int l = 0;
        int r = arr.length - 1;
        int mid = 0;
        while (l < r) {
            //        保证不会越界
            mid = l + ((r-l) >> 1);
            if (arr[mid] == num) {
                return true;
            } else if (arr[mid] > num) {
                r = mid - 1;
            } else if (arr[mid] < num) {
                l = mid + 1;
            }
        }
        return arr[l] == num;
    }

2、一个有序数组中,找>=某个数最左侧的位置

public class BSNearLeft {
    //    找到最左位置 找满足>=value的最左位置
    public static int nearest(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;
    }
    public static void main(String[] args) {
        int[] arr = {1,2,2,2,3,3,4,4,5,5};
        int index = nearest(arr, 5);
        System.out.println(index);
    }

}

3、局部最小值问题

package com.jhy.day07;

/**
 * 局部最小值(0<1,n-1<n-2 i<i+1 && i<i-1   所以0和n-1和i都是局部最小)
 * 在一个数组当中,这个arr无序,任意两个相邻的数一定不相等。
 * 下面求一个局部最小的值 只需要一个就行
 * 不一定有序就二分
 * 2022年8月31日20:56:29
 */
public class FindOneLessValueIndex {

    public static int getLessIndex(int[] arr) {
        if (arr == null || arr.length == 0) {
            return -1; // no exist
        }
        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的值
            mid = left + ((right-left)>>1);
//            两个数一定不相等 所以我们不用考虑相等问题
            if(arr[mid] > arr[mid-1]){
                right = mid-1;
            }else  if(arr[mid] > arr[mid+1]){
                left = mid+1;
            }else {
                return mid;
            }
        }
        /*
        *这里放回left和right是一样的
        * */
        return right;
    }

    public static void printArray(int[] arr) {
        for (int i = 0; i != arr.length; i++) {
            System.out.print(arr[i] + " ");
        }
        System.out.println();
    }

    public static void main(String[] args) {
        int[] arr = { 6, 5, 3, 4, 6, 7, 8 };
        printArray(arr);
        int index = getLessIndex(arr);
        System.out.println("index: " + index + ", value: " + arr[index]);

    }
}