Я столкнулся с этим вопросом алгоритма. Я смог реализовать решение 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.
Пример:
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);
}
}
Также в моем решении внутренний цикл работает от я + 1 до N, поэтому наихудший случай - N-1 для этого цикла. Мое общее решение все еще O (n ^ 2)?