这是一项学校作业,但是,要求是“以最高性能实施该程序”-这对我的口味来说是模糊的,因为我不知道内存是否会超过速度等等。但是我在寻找什么是否存在通过对输入数据进行一些智能操作来解决问题的“棘手”方法。
所以,问题来了:假设你有两个数组,A 和 B,编写一个函数,如果 B 中有这样的整数,则返回 1,它等于 A 的任何两个后续元素的总和。
下面是我的文案。请注意,我没有使用Hashmap<Integer>
,因为我认为加速所需的内存是一个劣势,足以忍受 O(n * m) 速度作为我最坏的情况而不是 O(n)。
public static int arrayContainsSum(int[] a, int[] b)
{
int offsetA = a.length - 1;
int offsetB = offsetA;
int index = b.length - 1;
int result = 0;
int tested;
while (index >= 0)
{
if (offsetA > 0) a[offsetA] += a[--offsetA];
else if (offsetA == 0) // This has a danger of overflowing the int
a[offsetA--] = multiply(a);
tested = b[index];
if ((offsetA < 0 && tested != 0 && a[0] % tested != 0) ||
offsetB == 0)
{
// No point to test this element as it doesn't
//divide the product of sums
offsetB = a.length - 1;
index--;
}
if (tested == a[offsetB--])
{
result = 1;
break;
}
}
return result;
}
private static int multiply(int[] input)
{
int accumulator = input.length > 0 ? 1 : 0;
for (int i : input)
if (i != 0) accumulator *= i;
return accumulator;
}
有些事情我不关心:整数溢出(可能是乘法的结果)。我假设array.length
与从局部变量中读取一样快。
但是,再一次,我的问题是“不能分析地解决这个问题吗?” 这意味着更高的效率?
PS。问题没有提到数组是否只包含唯一成员 - 对此没有限制。我还认为可以通过排序来优化(如果我检测到这种情况),a
以便如果b[x]
小于 中的最小元素a
或大于 中的最大元素a
,它将节省一些查找 - 但是,这又是会以增加复杂性为代价,可能不完全合理。