Lo que evalúa el entrevistador
Dado un arreglo de enteros, devuelve la suma máxima de un subarreglo contiguo no vacío después de eliminar como máximo un elemento. La eliminación es opcional y los elementos restantes deben provenir de un único intervalo contiguo.
Restricciones y casos límite
- El arreglo no está vacío y puede contener valores negativos, cero o positivos.
- El resultado no puede ser un arreglo vacío.
- Eliminar un extremo del intervalo equivale a excluir ese extremo del intervalo elegido.
- Procura realizar una sola pasada en lugar de enumerar una posición de eliminación y dos subarreglos.
Convertir la eliminación en un estado
Mantén keep, la mejor suma que termina en el índice actual sin eliminación, y drop, la mejor suma que termina allí después de una eliminación. Para un valor x, keep elige reiniciar o extender; drop elige eliminar x o extender un estado que ya realizó una eliminación.
Separar los estados de resultado de los estados intermedios
La respuesta debe inspeccionar ambos estados porque la solución óptima puede no usar ninguna eliminación o remover un valor negativo. Inicializar drop en cero permitiría un subarreglo vacío o la eliminación de un elemento inexistente.
Explicar la complejidad lineal
Cada valor actualiza dos estados de tamaño constante, por lo que el tiempo es O(n) y el espacio adicional es O(1). Los estados son completos porque cada intervalo válido que termina aquí o bien no ha realizado ninguna eliminación o ha realizado exactamente una eliminación.
Preguntas de clarificación antes de responder
- ¿“A lo más uno” incluye ninguna eliminación? Requerir exactamente una cambia la respuesta y el límite para un solo elemento.
- ¿El resultado debe ser no vacío? Permitir una salida vacía puede hacer que cero sea incorrectamente la respuesta.
- ¿Puede la suma desbordar un entero de 32 bits? Esto determina el tipo de acumulador y el rango de prueba.
Estructura de respuesta en 30 segundos
“Mantengo dos estados que terminan en el índice actual: keep no tiene eliminación y drop tiene una. Para x, keep es reiniciar o extender; drop es eliminar x o extender el drop anterior. La respuesta es el máximo observado en ambos estados. Inicializo a partir del primer elemento en lugar de cero para entradas con solo números negativos, logrando tiempo O(n) y espacio O(1).”
Análisis detallado paso a paso
Sean los estados anteriores keepPrev y dropPrev. Actualízalos de la siguiente manera:
keep = max(x, keepPrev + x)
drop = max(dropPrev + x, keepPrev)El keepPrev de la segunda línea significa eliminar el elemento actual; el intervalo anterior ya contiene un elemento. dropPrev + x significa que la eliminación ocurrió antes y el valor actual se añade al final. Guarda los valores anteriores antes de sobrescribir cualquiera de los estados.
Para un arreglo de un solo elemento, keep es ese elemento y drop no debe representar un intervalo vacío legal. Inicializa drop en infinito negativo y actualiza a partir del segundo elemento, o define una semántica explícita para el primer elemento preservando la regla de no vacío.
Respuesta modelo de alta calidad
“Divido el problema en dos estados de PD. keep es la mejor suma que termina en este índice sin eliminación; drop es la mejor suma tras una eliminación. Para cada x, usando los estados anteriores, calculo keep=max(x, keep+x) y drop=max(drop+x, oldKeep). Inicializo a partir del primer valor para que un arreglo con solo negativos nunca devuelva cero, y luego tomo el máximo entre ambos estados. Cada valor requiere trabajo constante, lo que da un tiempo O(n) y un espacio O(1).”
Errores comunes
- Ejecutar Kadane ordinario sin un estado para la eliminación.
- Inicializar
dropen cero y permitir un intervalo vacío. - Calcular
dropa partir delkeepya actualizado, usando un valor dos veces. - Permitir un resultado vacío sin clarificar el límite del problema.
- Probar solo arreglos positivos y omitir los casos con solo negativos, de un solo elemento y de eliminación en los extremos.
Síntomas de falla y soluciones
Devolver cero para [-5] viola la regla de no vacío. Si [1,-2,0,3] nunca supera al Kadane ordinario, el estado de eliminación no está aportando. Escribe primero el invariante y luego rastrea un arreglo pequeño una transición a la vez.
Implementación en producción
Usa un acumulador lo suficientemente amplio para el rango de entrada. Para devolver el intervalo, lleva metadatos de inicio, índice de eliminación y fin con cada estado; la cantidad de estados sigue siendo constante, pero el desempate debe ser determinista.
Lista de verificación de pruebas
Prueba un solo elemento, todos negativos, todos positivos, eliminar un negativo intermedio, eliminar un extremo, múltiples óptimos y valores máximos. Para arreglos pequeños, compara contra una referencia O(n²) que enumere la eliminación opcional y ejecute Kadane, usando pruebas diferenciales aleatorizadas.
Preguntas de seguimiento y respuestas
¿Qué cambia si una eliminación es obligatoria?
No puedes simplemente devolver keep, porque la solución debe usar drop. Un arreglo de un elemento no tiene un resultado no vacío legal, por lo que la API necesita un centinela explícito o una longitud de entrada mínima.
¿Pueden las sumas de prefijos resolverlo?
Las sumas de prefijos pueden enumerar las posiciones de eliminación y los intervalos en O(n²). El preprocesamiento de subarreglos máximos izquierdo y derecho alcanza O(n) con espacio O(n); el escaneo de dos estados es más eficiente en espacio.
¿Cómo se recupera el intervalo real?
Lleva un índice de inicio y de eliminación con cada estado. Reinicia el inicio al reiniciar, registra el índice al eliminar el valor actual y rastrea el final a partir del estado que produjo la mejor respuesta.
Rúbrica de evaluación
- Definición de estados: distingue claramente entre ninguna eliminación y una eliminación.
- Transiciones correctas: utiliza estados anteriores y cubre el reinicio, la extensión y la eliminación del elemento actual.
- Límites completos: maneja casos con solo negativos, de un solo elemento, no vacíos y de desbordamiento.
- Complejidad precisa: alcanza tiempo O(n) y espacio adicional O(1).
- Verificación sólida: propone un enumerador de referencia y pruebas enfocadas en los límites.
Verificación de cumplimiento
Confirma que las transiciones de estado, los límites de no vacío y las afirmaciones de complejidad se mantengan consistentes.
Lista de verificación de la respuesta en la entrevista
Enuncia los dos invariantes, escribe ambas transiciones, enfatiza el guardar los valores anteriores y la inicialización con el primer elemento, luego proporciona la complejidad y las pruebas diferenciales aleatorizadas.
Conclusión en una frase
Permitir una eliminación agrega una dimensión de “ya eliminado” a la PD de estados contiguos de Kadane, produciendo un óptimo no vacío en tiempo lineal y espacio constante.