Wenn Sie am Tag kaufen i
, der maximale Gewinn Sie machen können, ist Amax(i) - A[i]
, wo Amax(i)
der höchste Preis ist, die i
nach Tage tritt. Mein Lesen der Spezifikation des Algorithmus ist, dass Sie das Array M
konstruieren und zurückgeben, deren Einträge durch M[i] = Amax(i) - A[i]
definiert sind.
Der höchste Preis, der nach dem Tag i
desto größer ist der A[i+i]
und dem höchsten Preis, der i + 1
Tag auftritt auftritt.
Der letzte Absatz gibt Ihnen eine rekursive Beziehung, mit der Ausnahme, dass im Gegensatz zu die „typischen“ Rekursion Sie könnten, der i
te Wert ist abhängig von dem i + 1
st Wert, anstatt umgekehrt sehen. Aber zum Glück für Sie wissen Sie bereits, dass n
th Wert und jeder spätere Wert ist 0, das heißt, nach Tag n
erhalten Sie 0 für Ihre Aktie. Sie müssen also nur die Werte für Tage 1, 2, ..., n - 1
herausfinden, die Sie in O (n) Zeit tun können. Und jedes Mal, wenn Sie einen dieser Werte finden, Amax(i)
, können Sie einen der Einträge M
mit M[i] = Amax(i) - A[i]
festlegen.
Wenn Sie den maximalen Gewinn zu finden, die an einem einzigen Tag durch den Kauf und Verkauf von an einem späteren Tag einen Anteils der Aktien vorgenommen werden können, eine Zeit (obwohl dies nicht von der Problemstellung erforderlich ist, so weit ich sehen kann), müssen Sie nur den maximalen Wert in M
finden, was Sie in O (n) Zeit tun können.
Wenn Ihr Ziel ist, den maximalen Gewinn durch eine Reihe von Aktionen zu ermöglichen, Kauf und Verkauf von Aktien, ist das Beste, was Sie tun können, so viele Aktien wie möglich zu kaufen, wenn die Aktie auf einem lokalen Minimum ist unendlichen Preis vor dem ersten Tag) und verkaufen alles, wenn es einen lokalen Höchstpreis erreicht. Sie können alle lokalen Minima und Maxima in O (n) Zeit identifizieren, A
in beide Richtungen scannen, und einen Startbetrag des Geldes geben, können Sie den maximalen Gesamtgewinn in O (n) Zeit unter Verwendung der Liste der lokalen Minima und berechnen Höchstwerte von A
. (Dies verwendet jedoch nicht das Array, das Sie von der ursprünglichen Problembeschreibung angefordert hatten, da dieses Array weder die Anzahl der gekauften Aktien noch die Möglichkeit mehrerer Transaktionen berücksichtigt.)
Denken Sie daran, dass, wenn jeder Durchlauf eines Zwei-Durchlauf-Algorithmus O (n) -Zeit benötigt, der Algorithmus als Ganzes eine O (n) -Zeit benötigt.
es im Grunde sagt Ihnen die MIN und MAX jeder finden Tagesgeschäft. Sie kaufen bei MIN (i) und verkaufen bei MAX (i + 1), mit Ausnahme des letzten Tages, an dem Sie nicht mehr kaufen. –
Jeden Tag die Aktie 'S' identifizieren, wobei' Kurs (S, n + 1)/Kurs (S, n) 'so groß wie möglich ist. Wenn es weniger als 1 ist, setze dich an diesem Tag hin. Ansonsten kaufe soviel von S wie du kannst. – btilly