【Medio】 56-Intervalos de fusión

Titulo

Dada una colección de intervalos, combine todos los intervalos superpuestos.

Dado un conjunto de intervalos, combine todos los intervalos superpuestos.

Ejemplo 1

输入: [[1,3],[2,6],[8,10],[15,18]]
输出: [[1,6],[8,10],[15,18]]
解释: 区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].

Ejemplo2

输入: [[1,4],[4,5]]
输出: [[1,5]]
解释: 区间 [1,4] 和 [4,5] 可被视为重叠区间。

Fuente: LeetCode
Enlace: https://leetcode.com/problems/merge-intervals/

Solución

Método: ordenar

Ideas para resolver problemas

Primero, usamos un eje numérico para abstraer el proceso de fusión de intervalos. Para un conjunto de intervalos, podemos obtener el intervalo final por su cobertura en el eje numérico, siempre que el bloque cubierto más a la izquierda comience a juzgar su área adyacente Si los bloques se pueden fusionar, y verifique gradualmente para obtener todos los intervalos finales

Se puede saber que la base para juzgar si se pueden fusionar dos intervalos es la relación entre el punto inicial del intervalo del punto inicial más grande y el punto final del intervalo del punto inicial más pequeño (si el punto inicial es el mismo, puede fusionarse). Suponiendo que el punto inicial del intervalo a es menor que el punto inicial del intervalo b, entonces, si el punto inicial del intervalo b <= el punto final del intervalo a, entonces los dos intervalos pueden fusionarse, el punto inicial de la fusión es el punto inicial del intervalo a, el punto final de la fusión es el intervalo ay el intervalo El punto final más grande entre b.

Entonces, para un conjunto de intervalos, siempre que combinemos los intervalos de entrada en secuencia, por ejemplo, para los intervalos 1, 2, ... n, primero considere el intervalo 1 como intervalo a, y el intervalo 2 como intervalo b, si es posible Después de la fusión, el nuevo intervalo obtenido continúa fusionándose con el intervalo 3. Cuando el nuevo intervalo combinado Inter y el intervalo i no pueden fusionarse, el intervalo Inter es uno de los resultados finales; en este momento, usaremos i como el nuevo intervalo a , I + 1 como el intervalo b repite el proceso anterior.

Pero la premisa es que el punto de inicio del intervalo 1-n está organizado de pequeño a grande. No tenemos forma de asegurar que la entrada se clasifique de acuerdo con el tamaño del punto de inicio, por lo que primero debemos ordenar los intervalos y luego fusionarnos de acuerdo con el algoritmo anterior para obtener el resultado final.

Código

class Solution {
public:
    static bool comp(const vector<int> &a, const vector<int> &b){
        return a[0] < b[0];
    }
    vector<vector<int>> merge(vector<vector<int>>& intervals) {
        vector<vector<int>> res;
        sort(intervals.begin(), intervals.end(), comp); // 使用comp函数辅助排序
        int start = 0, end = 0;
        for(int i = 0;  i < intervals.size(); ++i){ // 从左到右排查数轴上的区块
            end = intervals[i][1];
            res.push_back(vector<int>(2, intervals[i][0])); // 新区间的起点一定是第一个区块的起点
            while(i<intervals.size()-1 && end >= intervals[i+1][0]){ // 下一个区块可以合并
                end = intervals[i+1][1] > end ? intervals[i+1][1] : end; // 判断当前区间的终点
                i++; // 继续判断下一个区块是否可以合并
            }
            res[res.size()-1][1] = end; // 后面已经没有可以合并的区块,就结束当前区间,从下一个区间开始找
        }
        return res;
    }
};

Supongo que te gusta

Origin www.cnblogs.com/suata/p/12711183.html
Recomendado
Clasificación