代码-二分法求大于x的最左侧

40 阅读1分钟
package class01.question01;

import java.util.Arrays;

/**
 * @author ThugsInSuits
 * Date 2024/10/23 23:02
 * Version 1.0
 * @ClassName BiNearLeft
 * @Description 二分找>=某个数的最左值位置,[1,2,3,4]找到>=3最左侧的值是4
 **/
public class BiNearLeft {
    public static int biNearLeft(int[] arr ,int target) {
        if (arr == null || arr.length == 0) {
            return -1;
        }
        int left = 0;
        int right = arr.length - 1;
        int mid = 0;
        // 这里使用index = -1 是因为,当找到最左的那值后,也就是最后一个>=target的位置后,
        // 会继续往下找,但是此时后面的值都不在>=target,走的都是小与target的分支
        int index = -1;
        while (left <= right) {
            mid = left + ((right - left) >> 1);
            if (arr[mid] >= target) {
                index = mid;
                right = mid - 1;
            }else {
                left = mid + 1;
            }
        }
        return index;
    }

    // 用一个通用方法做比较
    public static int compareFunction(int[] arr,int target){
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] >= target) {
                return i;
            }
        }
        return -1;
    }

    public static int[] randomGenrateArr(int maxValue,int maxLength) {
        int[] arr = new int[(int) (Math.random() * (maxLength+1))];
        for (int i = 0; i < arr.length; i++) {
            // 保证取的数值在[-maxValue,maxValue]之间
            arr[i] = (int) (Math.random() * (maxValue + 1)) - (int) (Math.random()*maxValue);
        }
        return arr;
    }

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

    public static void main(String[] args) {
        int maxValue = 100;
        int maxLenth = 100;
        for (int i = 0; i < 1000; i++) {
            int[] arr = randomGenrateArr(maxValue, maxLenth);
            Arrays.sort(arr);
            int target = (int) (Math.random() * (maxValue + 1)) - (int) (Math.random()*maxValue);
            if (biNearLeft(arr,target) != compareFunction(arr,target) ) {
                printArr(arr);
                System.out.println(target);
                System.out.println(arr[biNearLeft(arr, target)] );
                System.out.println(arr[compareFunction(arr, target)]);
                return;
            }
        }
        System.out.println("success");
    }
}