Максимальная прибыль от цен на акции
Я пытаюсь выяснить алгоритм "разделяй и властвуй" за O(nlogn) время, чтобы решить следующую реальную проблему -
Предположим, у нас есть массив цен на акции. Придумайте алгоритм, который распечатывает массив с максимальной прибылью за каждый день в массиве.
Так, например, если бы у нас был массив A = [4,6,2,1], наши дни представляли бы каждый индекс, и наш вывод был бы массивом со значениями [2,-4,-1,-1] с последний день был значением -A[i].
Я выяснил алгоритм грубой силы, который -
1.) Scans the array for max after A[i]
2.) Subtracts A[i] with max, places value in A', iterates to next day
3.) When max reaches itself, repeat steps 1 & 2
4.) When you reach the end, the value is -A[i], return
Кроме того, я запутался, если временная сложность алгоритма, описанного выше, будет o(n) или o(n^2). Самая большая стоимость в алгоритме - найти максимум, все остальное - o(1).
Может кто-нибудь, пожалуйста, помогите мне? Спасибо
2 ответа
Вы не хотите делить победителя здесь. Вы можете сделать это за линейное время (O(n)). Вот код в Java, но вы можете сделать это на любом языке:
int[] maxProfit = new int[prices.length];
int maxPrice = 0;
for (int i = prices.length - 1; i >= 0; i--) {
maxProfit[i] = maxPrice - prices[i];
maxPrice = Math.max(maxPrice, prices[i]);
}
Это предполагает, что у вас есть массив, prices
, который содержит ваши цены в виде целых чисел.
Ключевым моментом здесь является то, что вы можете получить всю необходимую информацию, начиная с конца и возвращаясь назад.
Это можно сделать за одно линейное сканирование, поэтому сложность O(n)
, Прежде всего, давайте создадим массив максимумов M
т.е. M[i]
содержит максимальное количество, которое мы имеем после i
день
При обратном линейном сканировании это легко сделать:
У нас есть A = [4,6,2,1]
Итак, на первом этапе мы берем последний элемент A
который равен 1, и это максимальное значение на данный момент, так M[3] = 1
тогда мы получим M[2] = max(M[3],A[2]) = 2
тогда мы получим M[1] = max(M[2],A[1]) = 6
наконец на последнем шаге мы получаем M[0] = max(M[1], A[0]) = 6
,
Мы будем иметь M = [6,6,2,1]
, Этот алгоритм имеет O(n)
сложности, то мы запустим еще один цикл для определения максимальной прибыли за каждый день, который также имеет O(n)
сложность. Кстати, мы можем не хранить значения M
и вместо хранения всего массива хранить только максимальное значение после i
день