我遇到了这个算法问题。我能够实现 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|
, where |x|
表示x的绝对值。
Example:
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) 吗?