我想知道是否有可能在排序的List中找到列表中不是的元素的最接近元素。
例如,如果我们具有[1,3,6,7]值,并且正在寻找最接近4的元素,则它应返回3,因为3是数组中的最大数字,小于4。
我希望这是有道理的,因为英语不是我的母语。

最佳答案

由于集合已排序,因此可以在O( log n )中进行修改后的二进制搜索:

    public static int search(int value, int[] a) {

        if(value < a[0]) {
            return a[0];
        }
        if(value > a[a.length-1]) {
            return a[a.length-1];
        }

        int lo = 0;
        int hi = a.length - 1;

        while (lo <= hi) {
            int mid = (hi + lo) / 2;

            if (value < a[mid]) {
                hi = mid - 1;
            } else if (value > a[mid]) {
                lo = mid + 1;
            } else {
                return a[mid];
            }
        }
        // lo == hi + 1
        return (a[lo] - value) < (value - a[hi]) ? a[lo] : a[hi];
    }
由于上面的大多数代码都是二进制搜索,因此您可以利用std库中提供的 binarySearch(...) 并检查insertion point的值:
    public static int usingBinarySearch(int value, int[] a) {
        if (value <= a[0]) { return a[0]; }
        if (value >= a[a.length - 1]) { return a[a.length - 1]; }

        int result = Arrays.binarySearch(a, value);
        if (result >= 0) { return a[result]; }

        int insertionPoint = -result - 1;
        return (a[insertionPoint] - value) < (value - a[insertionPoint - 1]) ?
                a[insertionPoint] : a[insertionPoint - 1];
    }

关于java - 在排序列表中找到最接近/最接近的值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30245166/

10-12 00:30