[Codicioso] B031_ intervalo de fusión (ordenar)

1. Título Descripción

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

Input: [[1,3],[2,6],[8,10],[15,18]]
Output: [[1,6],[8,10],[15,18]]
Explanation: Since intervals [1,3] and [2,6] overlaps, merge them into [1,6].

En segundo lugar, la solución

Método 1: codicia

Idea equivocada: originalmente quería usar end para registrar el valor de la posición final máxima en los intervalos i-1 antes del ciclo i-th, y luego usarlo para decidir si fusionar los intervalos:

  • Si no coinciden, agregue la matriz actual directamente, seguida del nuevo valor final y el subíndice endi.
  • De lo contrario, deje que el punto final derecho del último elemento de la lista se establezca en max(end, inte[i][0])

Pero hay un problema con esto: cuando aparece una cosa tan rota, explota ...[[1,4],[0,5]]

public int[][] merge(int[][] inte) {
    if (inte.length <= 1) {
        return inte;
    }
    List<int[]> list = new LinkedList<>();
    int end = inte[0][1], endi = 0;
    Arrays.sort(inte, (e1, e2) -> e1[0] - e2[0]);
    list.add(inte[0]);
    for (int i = 1; i < inte.length; i++) {
        if (end < inte[i][0]) { 	  //无交集
            list.add(inte[i]);
            end = inte[i][1];
            endi = i;
        } else if (end >= inte[i][0]){//交集
            list.get(endi)[1] = Math.max(inte[i][1], end);
        }
    }
    int[][] res = new int[list.size()][2];
    int i = 0;
    for (int[] arr : list) {
        res[i++] = arr;
    }
    return res;
}

Piénselo o juzgue el problema directamente en la lista vinculada.

public int[][] merge(int[][] inte) {
    if (inte.length == 1) {
        return inte;
    }
    List<int[]> list = new ArrayList<>();
    Arrays.sort(inte, (e1, e2) -> e1[0] - e2[0]);

    for (int i = 0; i < inte.length; i++) {
        if (list.isEmpty() || list.get(list.size()-1)[1] < inte[i][0]) {
            list.add(inte[i]);
        } else {
            int end = list.get(list.size()-1)[1];
            list.get(list.size()-1)[1] = Math.max(end, inte[i][1]);
        }
    }
    int[][] res = new int[list.size()][2];
    int i = 0;
    for (int[] arr : list) {
        res[i++] = arr;
    }
    return res;
}

Análisis de complejidad.

  • Complejidad del tiempo: El ( ) O ()
  • Complejidad espacial: El ( ) O ()
Publicado 714 artículos originales · elogiado 199 · 50,000+ vistas

Supongo que te gusta

Origin blog.csdn.net/qq_43539599/article/details/105570346
Recomendado
Clasificación