Maximum Subarray
Un subarreglo es una secuencia de elementos vecinos de una lista, tomada sin saltos. Entre todos los subarreglos no vacíos de una lista de enteros, quieres el que tenga la suma más alta de sus elementos y devuelves esa suma.
En [2, -4, 3, -1, 5, -6, 1], la mejor secuencia es [3, -1, 5], con una suma de 7. Conserva el -1 porque el 5 que viene después compensa con creces su valor, y excluye el 2 del principio porque el -4 que le sigue cuesta más de lo que aporta el 2.
La solución clásica de una sola pasada es el algoritmo de Kadane. Recorre la lista y lleva la cuenta de la mayor suma de una secuencia que termina en el elemento actual. En cada elemento solo hay dos opciones: extender la secuencia que terminaba en el elemento anterior, o empezar de nuevo con una nueva secuencia que comienza aquí. Extender solo resulta ventajoso mientras la secuencia anterior tenga una suma positiva; una vez que esa suma llega a cero o es negativa, mantenerla solo puede perjudicar, así que empiezas de nuevo. La respuesta es la mayor suma de secuencia que se haya visto durante el recorrido.
Para el ejemplo, las mejores sumas de secuencias que terminan en cada posición son 2, -2, 3, 2, 7, 1 y 2, así que la respuesta es 7. Cada elemento se examina una vez, por lo que el trabajo crece linealmente con la longitud de la lista.
Escribe una función llamada maxSubArray que reciba una lista de enteros nums y devuelva la suma más grande de un subarreglo contiguo y no vacío de nums.
Restricciones: 1 ≤ nums.length ≤ 10^5, -10^4 ≤ nums[i] ≤ 10^4.
Función
- arg1integer-array
- Devuelveinteger
Ejemplos
- Entrada
- arg1 = [2, -4, 3, -1, 5, -6, 1]
- Salida
- 7
- Entrada
- arg1 = [-3, -1, -2]
- Salida
- -1
+12 pruebas ocultas al enviar
Pistas
Ábrelas de una en una. Cada una revela un poco más.
Concéntrate en las secuencias que terminan exactamente en una posición. ¿Cómo se relaciona la mejor secuencia que termina aquí con la mejor secuencia que termina en la posición inmediatamente anterior?
Una secuencia que termina en el elemento actual o bien continúa la secuencia que terminó justo antes de él, o bien empieza de nuevo en este elemento. Continuar solo ayuda cuando esa secuencia anterior tiene una suma positiva.
Recorre la lista una vez y mantén dos números: la mejor suma de una secuencia que termina en el elemento actual y la mejor suma vista hasta el momento. Empieza con ambos en el primer elemento, de modo que una lista con solo números negativos devuelva igualmente su elemento más grande.
Pronto habrá una explicación completa de este problema.
Problemas similares
Problemas que usan las mismas ideas. Resolver dos o tres es lo que fija un patrón.
Python
def maxSubArray(nums):
# Escribe el código aquíCaso 1
Caso 2
Entrada
arg1 = [2, -4, 3, -1, 5, -6, 1]
Esperado
7