如何在目标上方的数组中找到最接近的数字?

How to find closest number in array above target?

我使用此代码查找数组中最接近的数字,但此方法也是 return 低于目标数字的数字。所以如果目标是 5 并且数组有 4 个 7 它将 return 4。 我如何更改此代码以显示高于目标的最近数字。

    public static int findClosest(Integer[] arr, int target) {
        int idx = 0;
        int dist = Math.abs(arr[0] - target);


        for (int i = 1; i < arr.length; i++) {
            int cdist = Math.abs(arr[i] - target);
//TODO MAKE CLOSEST NUMBER BE ABOVE TARGET
            if (cdist < dist) {
                idx = i;
                dist = cdist;
            }
        }
        Log.e("FIND!!!", "CLOSEST MINUTE IS --->" + arr[idx]);
        int minute_of_day = arr[idx];

        return minute_of_day;

    }

这是一种方法(需要导入 java.util 包)- 按升序对数组进行排序,然后找到第一个更高的元素(如果存在)。数组中可能不存在更高的值,因此必须处理该错误。

public static int findClosestHigher(Integer[] arr, int target) throws NoSuchElementException {
       
    List<Integer> arrList = Arrays.asList(arr);
    Collections.sort(arrList);
    
    for (int element : arrList) {
        if (element > target) {
            System.out.println("FOUND!!! CLOSEST HIGHER IS --->" + element);                
            return element;
        }
    }
    
    throw new NoSuchElementException();
}

只需根据您的要求修改代码:找到超出目标的最少数量。检查输入数组中的 null 值也是有意义的。

public static Integer findClosestAbove(Integer[] arr, int target) {
    Integer min = null;

    for (Integer x : arr) {
        if (x != null && x > target && (min == null || min > x)) {
            min = x;
        }
    }
    return min; // may be null
}

使用Java流API的类似解决方案如下:

public static Integer findClosestAboveStream(Integer[] arr, int target) {
    return Arrays.stream(arr)
                 .filter(x -> x != null && x > target)
                 .min(Integer::compareTo) // Optional<Integer>
                 .orElse(null); // or orElseGet(() -> null)
}

测试:

Integer[] arr = new Integer[]{1, 2, null, 7, 4};
System.out.println("findClosest:\t" + findClosestAbove(arr, 5));
System.out.println("findClosest2:\t" + findClosestAboveStream(arr, 5));

输出:

findClosest:    7
findClosest2:   7

一种替代方法是以下方法:

  public static int findClosest(Integer[] arr, int target) {
        int temp = Integer.MAX_VALUE;
        for(int i: arr){
          if(i > target && i < temp){
            temp = i;
          }
        }
        return temp;
    }

此代码的工作方式是,它首先初始化一个整数,temp 为可能的最大整数。然后,我们开始遍历 arr,每当我们发现一个值大于目标值但小于 temp 的当前值时,我们将 temp 设置为等于该值。最后,在我们遍历之后,我们 return 该值。