我遇到了这个算法问题。我能够实现O(n ^ 2)解决方案。在O(n)时间内有更好的方法吗?
题:
您将得到N个整数数组A1, A2 ,…, AN。返回的最大值f(i, j)为所有1 ≤ i, j ≤ N。 f(i, j)定义为|A[i] - A[j]| + |i - j|,其中|x|表示x的绝对值。
A1, A2 ,…, AN
f(i, j)
1 ≤ i, j ≤ N
|A[i] - A[j]| + |i - j|
|x|
范例 :
A=[1, 3, -1] f(1, 1) = f(2, 2) = f(3, 3) = 0 f(1, 2) = f(2, 1) = |1 - 3| + |1 - 2| = 3 f(1, 3) = f(3, 1) = |1 - (-1)| + |1 - 3| = 4 f(2, 3) = f(3, 2) = |3 - (-1)| + |2 - 3| = 5
因此,我们返回5。
我的答案:
public class Solution { public int maxArr(ArrayList<Integer> A) { int maxSum = 0; for(int i=1; i<=A.size()-1; i++){ for(int j=i+1; j<=A.size(); j++){ int tempSum = sum(A.get(i-1), A.get(j-1), i, j); if(tempSum > maxSum) { maxSum = tempSum; } } } return maxSum; } public int sum(int Ai, int Aj, int i, int j) { return Math.abs(Ai-Aj) + Math.abs(i-j); } }
同样在我的解决方案中,内部循环从i +1到N,因此最坏的情况是该循环为N-1。我的整体解决方案仍然是O(n ^ 2)吗?
是的,您的解决方案仍然O(N^2)是(N - 1) + (N - 2) + ... + 1 = N * (N - 1) / 2。
O(N^2)
(N - 1) + (N - 2) + ... + 1 = N * (N - 1) / 2
我将展示如何解决线性时间中的一个更一般的问题:给出2D空间中的一个点列表(x [i],y [i]),找到两个最远的点(相对于曼哈顿距离)。
让我们找到以下几点:max(x [i] + y [i]),max(-x [i] + y [i]),max(-y [i] + x [i])和max(- x [i]-y [i])在所有i中。
让我们计算列表中每个点与上一步中选择的四个点之间的距离,并选择最大的一个。考虑到4 * N成对的点,该算法显然可以在线性时间内工作。我声称这是正确的。
4 * N
为什么?让我们固定一个点(x [k],y [k])并尝试找到离它最远的点。考虑任意点(x [i],y [i])。让我们扩展它们坐标之间的差的绝对值。假设它是x[i] + x[k] + y[i] + y[k] = (x[k] + y[k]) + x[i] + y[i]。第一项是常数。如果x[i] + y[i]不是最大i,(x[i], y[i])就不可能是最远的。其他三种情况(取决于扩展中x [i]和y [i]的符号)以相同的方式处理。
x[i] + x[k] + y[i] + y[k] = (x[k] + y[k]) + x[i] + y[i]
x[i] + y[i]
i
(x[i], y[i])