Maximum Subarray
Ein Teilarray ist eine zusammenhängende Folge benachbarter Elemente einer Liste, ohne Lücken. Unter allen nicht leeren Teilarrays einer Liste von Ganzzahlen möchtest du dasjenige finden, dessen Elemente sich zur größten Summe addieren, und diese Summe zurückgeben.
In [2, -4, 3, -1, 5, -6, 1] ist die beste Folge [3, -1, 5] mit einer Summe von 7. Sie enthält die -1, weil die darauffolgende 5 den Verlust mehr als ausgleicht, und lässt die 2 am Anfang aus, weil die darauffolgende -4 mehr kostet, als die 2 einbringt.
Die klassische Lösung in einem Durchlauf ist Kadanes Algorithmus. Gehe die Liste durch und behalte die beste Summe einer Folge, die beim aktuellen Element endet. Bei jedem Element gibt es nur zwei Möglichkeiten: Die Folge, die beim vorherigen Element endete, verlängern oder mit einer neuen Folge, die hier beginnt, neu starten. Das Verlängern lohnt sich nur, solange die vorherige Folge eine positive Summe hat; sobald diese Summe auf null oder darunter sinkt, kann es nur schaden, sie mitzunehmen, also beginnst du von vorn. Die Antwort ist die größte Summe einer Folge, die du unterwegs gesehen hast.
Im Beispiel lauten die besten Summen der Folgen, die an jeder Position enden, 2, -2, 3, 2, 7, 1 und 2; die Antwort ist also 7. Jedes Element wird einmal betrachtet, daher wächst der Aufwand linear mit der Länge der Liste.
Schreibe eine Funktion namens maxSubArray, die eine Liste von Ganzzahlen nums erhält und die größte Summe eines zusammenhängenden, nicht leeren Teilarrays von nums zurückgibt.
Einschränkungen: 1 ≤ nums.length ≤ 10^5, -10^4 ≤ nums[i] ≤ 10^4.
Funktion
- arg1integer-array
- Gibt zurückinteger
Beispiele
- Eingabe
- arg1 = [2, -4, 3, -1, 5, -6, 1]
- Ausgabe
- 7
- Eingabe
- arg1 = [-3, -1, -2]
- Ausgabe
- -1
+12 versteckte Tests beim Einreichen
Tipps
Öffne sie nacheinander. Jeder verrät ein bisschen mehr.
Konzentriere dich auf Folgen, die genau an einer Position enden. Wie hängt die beste Folge, die hier endet, mit der besten Folge zusammen, die an der direkt davorliegenden Position endet?
Ein Lauf, der beim aktuellen Element endet, setzt entweder den Lauf fort, der unmittelbar davor endete, oder beginnt bei diesem Element neu. Das Fortsetzen ist nur dann hilfreich, wenn die Summe des vorherigen Laufs positiv ist.
Gehe die Liste einmal durch und behalte zwei Zahlen im Blick: die beste Summe eines zusammenhängenden Abschnitts, der beim aktuellen Element endet, und die beste bisher gefundene Summe. Setze beide auf das erste Element, damit eine Liste, die nur negative Zahlen enthält, trotzdem ihr größtes Element zurückgibt.
Eine vollständige Lösungserklärung zu dieser Aufgabe folgt bald.
Ähnliche Aufgaben
Aufgaben mit denselben Ideen. Wer zwei oder drei davon löst, behält das Muster.
Python
def maxSubArray(nums):
# Schreibe hier den CodeFall 1
Fall 2
Eingabe
arg1 = [2, -4, 3, -1, 5, -6, 1]
Erwartet
7