Максимальная прибыль от цен на акции
Я пытаюсь вычислить алгоритм разделения и завоевания с O (nlogn) временем для решения следующей задачи реального мира -
Предположим, что у нас есть массив цен на акции. Придумайте алгоритм, который выводит массив с максимальной прибылью за каждый день i в массиве. Так, например, если бы у нас был массив 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
- го дня.