Предположим, что у меня есть массив целых чисел:
int[] A = { 10, 3, 6, 8, 9, 4, 3 };
Моя цель - найти наибольшую разницу между A [Q] и A [P] такими, что Q > P.
Например, если P = 2 и Q = 3, то
diff = A[Q] - A[P]
diff = 8 - 6
diff = 2
Если P = 1 и Q = 4
diff = A[Q] - A[P]
diff = 9 - 3
diff = 6
Так как 6 - наибольшее число между всеми различиями, то есть ответ.
Мое решение выглядит следующим образом (в С#), но оно неэффективно.
public int solution(int[] A) {
int N = A.Length;
if (N < 1) return 0;
int difference;
int largest = 0;
for (int p = 0; p < N; p++)
{
for (int q = p + 1; q < N; q++)
{
difference = A[q] - A[p];
if (difference > largest)
{
largest = difference;
}
}
}
return largest;
}
Как я могу улучшить это, чтобы он работал в O (N)? Спасибо!
Простое использование max и min не будет работать. Minuend (Q) должен появиться после Subtrahend (P).
Этот вопрос основан на проблеме "максимальной прибыли" в кодовости (http://codility.com/train/). Мое решение только набрало 66%. Это требует O (N) для оценки 100%.