2817. 限制条件下元素之间的最小绝对差.txt

UP 返回
https://leetcode.cn/problems/minimum-absolute-difference-between-elements-with-constraint/

熟练运用二分查找


public class LeetCode02 {

    public static void main(String[] args) {
        List<Integer> nums = new ArrayList<>();
        nums.add(1);
        nums.add(74);
        nums.add(40);
        nums.add(99);
//        nums.add(168);
        System.out.println(minAbsoluteDifference(nums, 1));
        // 8084511998
    }


    public static int minAbsoluteDifference(List<Integer> nums, int x) {
        int min = Integer.MAX_VALUE;
        List<Integer> sortList = new ArrayList<>();
        for (int i = x; i < nums.size(); i++) {
//            addNumToSub(sortList, nums.get(i));
            addToMinSub(sortList, nums.get(i - x));
            min = Math.min(min, minSub(sortList, nums.get(i)));
            if (min == 0) {
                break;
            }
        }
        return min;
    }

    private static void addToMinSub(List<Integer> sortList, int value) {
        if (sortList.size() == 0) {
            sortList.add(value);
        } else if (sortList.get(0) >= value) {
            sortList.add(0, value);
        } else if (sortList.get(sortList.size() - 1) <= value) {
            sortList.add(value);
        } else {
            int left = 0, right = sortList.size() - 1;
            while (right - left > 1) {
                int mid = (right - left) / 2 + left;
                int num = sortList.get(mid);
                if (num == value) {
                    return;
                }
                left = num < value ? mid : left;
                right = num > value ? mid : right;
            }
            sortList.add(right, value);
        }
    }

    private static int minSub(List<Integer> sortList, int value) {
        if (sortList.get(0) >= value) {
            return sortList.get(0) - value;
        }
        if (sortList.get(sortList.size() - 1) <= value) {
            return value - sortList.get(sortList.size() - 1);
        }

        int left = 0, right = sortList.size() - 1;
        while (right - left > 1) {
            int mid = (right - left) / 2 + left;
            int num = sortList.get(mid);
            if (num == value) {
                return 0;
            }
            left = num < value ? mid : left;
            right = num > value ? mid : right;
        }
        int low = sortList.get(left);
        int high = sortList.get(right);
        return Math.min(value - low, high - value);
    }
}
DOWN 返回