Pregunta diaria de Leetcode: 56. Fusión de intervalos

Titulo original

Utilice una matriz intervalspara representar un conjunto de varios intervalos, donde un único intervalo es intervals[i] = [starti, endi]. Combine todos los intervalos superpuestos y devuelva  una matriz de intervalos no superpuestos que cubra exactamente todos los intervalos en la entrada  .

Ejemplo 1:

Entrada: intervalos = [[1,3],[2,6],[8,10],[15,18]]
 Salida: [[1,6],[8,10],[15,18]]
 Explicación: Los intervalos [1,3] y [2,6] se superponen, fusionándolos en [1,6].

Ejemplo 2:

Entrada: intervalos = [[1,4],[4,5]]
 Salida: [[1,5]]
 Explicación: Los intervalos [1,4] y [4,5] pueden considerarse intervalos superpuestos.

pista:

  • 1 <= intervals.length <= 104
  • intervals[i].length == 2
  • 0 <= starti <= endi <= 104

Ideas para resolver problemas

¿En qué circunstancias es necesario fusionar los intervalos? Por supuesto, solo es necesario fusionar la posición inicial de un intervalo si está ubicada en otro intervalo. Suponemos que el intervalo es Rango y contiene dos valores: izquierda y y. Para facilitar el procesamiento, debemos colocar Range2.left entre la izquierda y la derecha de Range1, por lo que aquí debemos ordenar según la izquierda. En el caso del orden izquierdo, el rango combinado es [Rango1.izquierda, nuevaDerecha], donde nuevaDerecha = max(Rango1.derecha, Rango2.derecha). Podemos agregar los intervalos ordenados a la matriz de resultados en secuencia. Si el intervalo actual no se superpone con el último intervalo de la matriz de resultados (es decir, Rango2.izquierda>Rango1.derecha), agréguelo. De lo contrario, reemplace el último intervalo de la matriz de resultados con el intervalo fusionado (estrictamente hablando, simplemente reemplace la derecha del último intervalo con newRight). La implementación completa es la siguiente:

lass Solution {
public:
    vector<vector<int>> merge(vector<vector<int>>& intervals) {
        if (intervals.size() == 0) {
            return {};
        }
        sort(intervals.begin(), intervals.end());
        vector<vector<int>> merged;
        for(int i = 0; i < intervals.size(); i++){
            int L = intervals[i][0], R = intervals[i][1];
            if (!merged.size() || merged.back()[1] < L) {
                merged.push_back({L, R});
            }
            else {
                merged.back()[1] = max(merged.back()[1], R);
            }
        }
        return merged;
    }
};

por fin

La fusión de intervalos es un algoritmo muy útil. Este año, cooperamos con una empresa de motores de datos para implementar un plan de ocultación de puntos para la aplicación de video de una estación de televisión. Uno de ellos es contar el tiempo de visualización de un determinado vídeo. Este período de tiempo no es cuántos minutos lo vemos en el sentido habitual, sino cuánto tiempo se ha visto el contenido del vídeo, ya sea a una velocidad o varias veces. Luego, debemos registrar cada operación, reproducir, pausar, arrastrar el inicio y el final, la velocidad de cambio, etc., y luego convertir estos puntos de eventos en intervalos, y luego implementar la fusión de intervalos y finalmente obtener el resultado que queremos. Se puede ver que la fusión de intervalos sigue siendo muy útil en nuestro desarrollo real.

Supongo que te gusta

Origin blog.csdn.net/Mamong/article/details/132525353
Recomendado
Clasificación