我正在解决Java中的一个问题,其中我必须找到2个整数数组的最大成对乘积。
示例:
array 1 -> [1, 3, -5]
array 2 -> [-2, 4, 1]
output: 23 // (3 * 4) + (1 * 1) + (-5 * -2)
我的当前代码也会产生此输出。
我的解决方案
对两个数组进行排序,然后将两个数组中相同索引处的数字相乘,然后将每个对的乘积相加。
问题
我的解决方案是使用我不知道的测试用例进行测试的。我的解决方案无法通过所有测试用例。我不确定是否有任何输入会使我的解决方案失败。
问题
我给定问题的解决方案出了点问题,导致我的代码无法通过所有测试用例吗?
代码
private static long maxSum(int[] a, int[] b) {
long result = 0;
Arrays.sort(a);
Arrays.sort(b);
for (int i = a.length - 1; i >= 0; i--) {
result += a[i] * b[i];
}
return result;
}
问题描述
答案 0 :(得分:1)
我想我知道问题出在哪里,如果无法联系法官,我将无法确定。考虑以下情况:a[i] = 10^5
和b[i] = 10^5
(问题中允许的最大值,现在为a[i] * b[i] = 10^10
)。由于a
和b
是整数类型,因此中间结果将存储为整数。由于数字10 ^ 10超出int的限制,因此会溢出。
要解决此问题,可以将数组值转换为long值。
result += Long.valueOf(a[i]) * Long.valueOf(b[i]);