Maximum Subarray
Un sottoarray è una sequenza di elementi adiacenti di una lista, senza interruzioni. Tra tutti i sottoarray non vuoti di una lista di interi, vuoi quello i cui elementi hanno la somma più alta e restituisci tale somma.
In [2, -4, 3, -1, 5, -6, 1] la sequenza migliore è [3, -1, 5], con una somma pari a 7. Include -1 perché il 5 che lo segue compensa più che ampiamente il suo valore negativo, ed esclude il 2 iniziale perché il -4 che lo segue costa più di quanto il 2 apporti.
La classica soluzione in un'unica passata è l'algoritmo di Kadane. Scorri la lista e tieni traccia della somma migliore di una sequenza che termina nell'elemento corrente. Per ogni elemento ci sono solo due possibilità: estendere la sequenza che terminava nell'elemento precedente oppure ricominciare con una nuova sequenza che inizia qui. Estendere conviene solo finché la sequenza precedente ha una somma positiva; quando quella somma scende a zero o al di sotto, mantenerla può solo essere uno svantaggio, quindi si riparte da zero. La risposta è la somma più alta tra quelle delle sequenze incontrate lungo il percorso.
Per l'esempio, le somme migliori delle sequenze che terminano in ciascuna posizione sono 2, -2, 3, 2, 7, 1 e 2, quindi la risposta è 7. Ogni elemento viene esaminato una volta sola, perciò il lavoro cresce linearmente con la lunghezza della lista.
Scrivi una funzione chiamata maxSubArray che riceve un elenco di numeri interi nums e restituisce la somma più grande di un sottoarray contiguo e non vuoto di nums.
Vincoli: 1 ≤ nums.length ≤ 10^5, -10^4 ≤ nums[i] ≤ 10^4.
Funzione
- arg1integer-array
- Restituisceinteger
Esempi
- Input
- arg1 = [2, -4, 3, -1, 5, -6, 1]
- Output
- 7
- Input
- arg1 = [-3, -1, -2]
- Output
- -1
+12 test nascosti all’invio
Suggerimenti
Aprili uno alla volta. Ognuno rivela un po’ di più.
Concentrati sulle serie che terminano esattamente in una posizione. In che modo la serie migliore che termina qui è correlata alla serie migliore che termina nella posizione immediatamente precedente?
Una sequenza che termina nell’elemento corrente o continua la sequenza terminata subito prima oppure ricomincia da questo elemento. Continuare è utile solo quando la sequenza precedente ha una somma positiva.
Percorri l’elenco una volta e tieni due numeri: la somma migliore di una sequenza che termina con l’elemento corrente e la somma migliore vista finora. Inizia entrambe dal primo elemento, così un elenco composto solo da numeri negativi restituisce comunque il suo elemento più grande.
Presto una spiegazione completa di questo problema.
Problemi simili
Problemi che usano le stesse idee. Risolverne due o tre è ciò che fissa uno schema.
Python
def maxSubArray(nums):
# Scrivi il codice quiCaso 1
Caso 2
Input
arg1 = [2, -4, 3, -1, 5, -6, 1]
Atteso
7