La segunda mitad de la respuesta de Richard Morris está en el camino correcto, pero no completamente allí. Básicamente continuaré donde lo dejó, completaré algunos detalles y agregaré algunas optimizaciones.
Usemos [matemática] B (i, j) [/ matemática] para denotar la respuesta a la siguiente pregunta: “¿Se pueden ensamblar todas las bolas originales con números [matemática] i, \ ldots, j-1 [/ matemática] una sola pelota?
Claramente, todo lo que necesitamos para resolver nuestra tarea es encontrar un par [matemáticas] (i, j) [/ matemáticas] de manera que [matemáticas] B (i, j) [/ matemáticas] sea verdadero y la suma de las bolas [matemáticas ] i [/ math] a [math] j-1 [/ math] es lo más grande posible. Haremos eso evaluando [matemática] B (i, j) [/ matemática] para cada rango posible [matemática] (i, j) [/ matemática], luego simplemente elegiremos el mejor rango para el cual [matemática] B (i, j) [/ math] es cierto.
- Funciones hash: ¿Cuál es una explicación intuitiva de los diversos algoritmos SHA? ¿Cuáles son las mejoras clave entre cada familia?
- ¿Cuál es la mejor estrategia para obtener una solución óptima para cualquier problema de codificación solicitado en la entrevista de codificación?
- Cómo calcular la suma de dígitos de cada número entre 1 y n
- ¿Existe un límite superior para la capacidad de comprensión de un individuo? Si es así, ¿qué se debe hacer para mejorarlo?
- ¿Cuáles son las mejores preguntas de la entrevista de estructura de datos de árbol?
Lo que requiere más tiempo al evaluar [matemáticas] B (i, j) [/ matemáticas] es evaluar si es posible dividir este rango en tres partes, fusionar cada parte en una bola (estas son llamadas recursivas), y luego fusionar esas tres partes en una sola. Y aquí es donde entra la optimización.
Tenemos que darnos cuenta de que no tenemos que intentar todas las formas posibles de dividir el rango [matemáticas] [i, j) [/ matemáticas] en tres partes. (El número de estas formas sería cuadrático en la longitud del rango). Solo necesitamos esas formas para las cuales la suma de la primera parte es igual a la suma de la tercera parte. Y el número de estos es necesariamente pequeño: en el peor de los casos, es lineal en [math] ji. [/ Math]
¿Cómo encontrar estas buenas formas? Comencemos con [matemáticas] i = k [/ matemáticas] y [matemáticas] l = j [/ matemáticas]. Las variables [matemáticas] k, l [/ matemáticas] dividen nuestro rango [matemáticas] [i, j) [/ matemáticas] en tres rangos: [matemáticas] [i, k) [/ matemáticas], [matemáticas] [k, l) [/ math] y [math] [l, j) [/ math]. Ahora nos moveremos [matemática] k, l [/ matemática] uno hacia el otro, siempre moviendo el que actualmente tiene la menor suma de tamaños de bolas. (Por ejemplo, cuando la suma de bolas en [matemáticas] [i, k) [/ matemáticas] es menor que la suma de bolas en [matemáticas] [l, j) [/ matemáticas], incrementamos [matemáticas] k [/ matemática].) Obviamente, de esta manera encontraremos todos los pares [matemática] k, l [/ matemática] de tal manera que las sumas de la primera y tercera parte sean iguales, ya que nunca podremos omitir tal par. Siempre que encontramos tal par [matemática] k, l [/ matemática], la procesamos y luego ambos incrementamos [matemática] k [/ matemática] y disminuimos [matemática] l [/ matemática].
Y eso es. Cada vez que encontramos un par válido [matemática] k, l [/ matemática], hacemos tres llamadas recursivas para verificar [matemática] B (i, k) [/ matemática], [matemática] B (k, l) [/ matemática] y [matemática] B (l, j). [/ matemática] Si las tres se evalúan como verdaderas, devolveremos verdaderas.
Con esta mejora, la solución se ejecuta en [math] O (n ^ 3) [/ math], que es claramente lo suficientemente rápido para las restricciones dadas.