Merge Intervals
Un intervalo es un rango de números enteros con un inicio y un fin. Los intervalos que comparten al menos un punto van juntos, y también los que solo se tocan: [1, 4] y [4, 5] se convierten en [1, 5]. El objetivo es reemplazar cada grupo de intervalos superpuestos por un solo intervalo que cubra todo el grupo.
El truco está en el orden. Una vez ordenados los intervalos por inicio, todo lo que se superpone con el intervalo que estás construyendo viene justo después. Recorre la lista ordenada y conserva el último intervalo fusionado: si el siguiente inicio es menor o igual que su fin, extiende el fin; si no, hay un espacio real y comienza un nuevo intervalo. La ordenación cuesta O(n log n) y el recorrido es de una sola pasada.
Escribe una función llamada mergeIntervals que reciba dos arreglos de enteros, starts y ends, y devuelva los intervalos fusionados.
Los intervalos se reciben como dos arreglos porque no todos los lenguajes de aquí aceptan un arreglo bidimensional como entrada: el intervalo i es [starts[i], ends[i]], y ambos arreglos tienen la misma longitud. Los intervalos no están ordenados.
Fusiona cada grupo de intervalos superpuestos. Los intervalos que solo se tocan en un extremo también cuentan como superpuestos. Devuelve los intervalos fusionados como un arreglo bidimensional [[start, end], ...], ordenados por inicio.
Por ejemplo, starts = [5, 1, 12, 3] y ends = [7, 4, 14, 6] describen [5, 7], [1, 4], [12, 14] y [3, 6], que se fusionan en [[1, 7], [12, 14]].
Restricciones: 1 <= starts.length == ends.length <= 10^4, 0 <= starts[i] <= ends[i] <= 10^4.
Función
- arg1integer-array
- arg2integer-array
- Devuelveinteger-2d-array
Ejemplos
- Entrada
- arg1 = [5, 1, 12, 3]arg2 = [7, 4, 14, 6]
- Salida
- [[1, 7], [12, 14]]
- Entrada
- arg1 = [6, 1]arg2 = [9, 6]
- Salida
- [[1, 9]]
+12 pruebas ocultas al enviar
Pistas
Ábrelas de una en una. Cada una revela un poco más.
Empareja primero cada inicio con su final, para trabajar con intervalos completos en lugar de con dos arreglos separados.
Ordena los intervalos por su inicio. Después, un intervalo solo puede solaparse con el grupo inmediatamente anterior, nunca con uno más alejado.
Recorre los intervalos ordenados mientras mantienes el último intervalo fusionado. Si el siguiente inicio es menor o igual que su final, establece su final en el mayor de los dos finales. De lo contrario, ese grupo termina y el siguiente intervalo abre uno nuevo.
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 mergeIntervals(starts, ends):
# Escribe el código aquíCaso 1
Caso 2
Entrada
arg1 = [5, 1, 12, 3] arg2 = [7, 4, 14, 6]
Esperado
[[1, 7], [12, 14]]