基于和的Java查找最近对是ArrayIndexOutOfBoundsException

问题描述 投票:-1回答:1

正在尝试根据总和找到最接近的对,但是得到一个

java.lang.ArrayIndexOutOfBoundsException: -1


Find a pair in array whose sum is closest to sum.

e.g.

Input: arr[] = {10, 22, 28, 29, 30, 40}, sum = 54
Output: 22 and 30

我的解决方案:

import java.util.Arrays;

public class ArrayUtils {

    public static int[] closestPairBasedOnSum(int[] arr, int sum) {
        if (arr == null) {
            return null;
        }

        if (sum < 1) {
            return null;
        }

        int[] closestPair = new int[2];

        int left = 0;
        int right = arr.length - 1;
        int diff = Integer.MAX_VALUE;

        while (right > left) {

            // this if is throwing the ArrayIndexOutOfBoundsException  
            if (Math.abs(arr[left] + arr[right] - sum) < diff) {
                closestPair[0] = arr[left];
                closestPair[1] = arr[right];
                diff = Math.abs(arr[left] + arr[right] - sum);
            }

            if (arr[left] + arr[right] > sum) {
                right--;
            }
            else {
                left--;
            }

        }
        System.out.println(Arrays.toString(closestPair));
        return closestPair;
    }

    public static void main(String[] args) {
        int [] arr = new int[] {10, 22, 28, 29, 30, 40};
        int[] closestPair = ArrayUtils.closestPairBasedOnSum(arr, 54);
        System.out.println(Arrays.toString(closestPair));
    }
}

输出:

java.lang.ArrayIndexOutOfBoundsException: -1

为什么不返回[22, 30]

java arrays algorithm computer-science puzzle
1个回答
0
投票

找出解决方案:

 public static int[] closestPairBasedOnSum(int[] arr, int sum) {
    if (arr == null) {
        return null;
    }

    if (sum < 1) {
        return null;
    }

    int[] closestPair = new int[2];

    int left = 0;
    int right = arr.length - 1;
    int diff = Integer.MAX_VALUE;

    while (right > left) {

        if (Math.abs(arr[left] + arr[right] - sum) < diff) {
            closestPair[0] = arr[left];
            closestPair[1] = arr[right];
            diff = Math.abs(arr[left] + arr[right] - sum);
        }

        if (arr[left] + arr[right] > sum) {
            right--;
        }
        else {
            left++;
        }
    }
    System.out.println(Arrays.toString(closestPair));
    return closestPair;
}
© www.soinside.com 2019 - 2024. All rights reserved.