Solución de problemas de Leetcode intervalo de combinación 56

Descripción del problema

Los intervalos de la matriz representan una colección de varios intervalos, y un único intervalo son intervalos [i] = [starti, endi]. Combine todos los intervalos superpuestos y devuelva una matriz de intervalo no superpuesta, que debe cubrir todos los intervalos en la entrada.

Ejemplo 1:

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

Ejemplo 2:

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

inmediato:

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

Ideas para resolver problemas

Si ordenamos por el extremo izquierdo del intervalo, en la lista ordenada, los intervalos que se pueden fusionar deben ser continuos. O podemos considerar que si el extremo izquierdo del intervalo no está ordenado, entonces para dos intervalos adyacentes cualesquiera, tenemos las siguientes relaciones. Podemos
Inserte la descripción de la imagen aquí
ver que hay 5 relaciones entre los dos intervalos. Si seguimos el extremo izquierdo de el intervalo Para ordenar, entonces solo hay 3 relaciones
Inserte la descripción de la imagen aquí

De hecho, la relación 1 y la relación 2 se pueden fusionar en una relación superpuesta, mientras que la relación 3 es una relación que no se superpone.
Aquí, el conjunto de intervalos está representado por una matriz bidimensional, por lo que la pregunta es, ¿cómo ordenar la matriz bidimensional de acuerdo con las condiciones especificadas en Java?
El mismo es el método de comparación que necesita implementar la interfaz Comparator. Se pasa un comparador en la función Arrays.sort (). El comparador usa una clase interna anónima para implementar
el código de muestra para ordenar matrices bidimensionales según las condiciones en Java como sigue :

public static void main(String[] args) {
    
    
		// TODO Auto-generated method stub
		int [][]matrix={
    
    {
    
    1,3},{
    
    6,8},{
    
    2,6},{
    
    4,7},{
    
    7,19},{
    
    12,18}};
		Arrays.sort(matrix,new Comparator<int[]>(){
    
    
			@Override
			public int compare(int[] o1, int[] o2) {
    
    
				return o1[0]-o2[0];
			}
		});
		for(int i=0;i<matrix.length;i++){
    
    
			System.out.println("x1="+matrix[i][0]+" x2="+matrix[i][1]);
		}
	}

Inserte la descripción de la imagen aquí

Usamos listas de colección ArrayList de matriz dinámica para almacenar la respuesta final.
Primero, ordenamos los intervalos de la lista en orden ascendente desde el punto final izquierdo.
Posteriormente, se escanea todo el intervalo y, durante el proceso de escaneo, fusionamos todos los intervalos que pueden tener intersecciones.
Necesitamos mantener un intervalo actual cada vez, y antes del ciclo, el primer intervalo del intervalo que se fusionará se usa como intervalo actual:

  • Si el punto final izquierdo del intervalo seleccionado cuando escaneamos está detrás del punto final derecho del intervalo actual, entonces no se superpondrán, podemos agregar el intervalo actual al conjunto de resultados y actualizar el intervalo actual al intervalo seleccionado durante el escaneo. ;

  • De lo contrario, se superponen.Necesitamos comparar el valor del punto final derecho del intervalo actual con el valor del punto final derecho del intervalo seleccionado durante el escaneo, y establecer el valor del punto final derecho del intervalo actual al valor mayor de los dos.

  • Inserte la descripción de la imagen aquí

Código de implementación

class Solution {
    
    
    public int[][] merge(int[][] intervals) {
    
    
        if(intervals.length==0 ||intervals.length==1){
    
    
            return intervals;
        }
        //对区间左端点进行排序
        Arrays.sort(intervals,new Comparator<int[]>(){
    
    
            public int compare(int []o1,int []o2){
    
    
                return o1[0]-o2[0];
            }
        });
        //创建动态数组用于保存最终结果集
        List<int[]> lists=new ArrayList<int[]>();
        int start=intervals[0][0],end=intervals[0][1];
        int len=intervals.length;
        for(int i=1;i<len;i++){
    
    
            //当选中的区间左端点大于当前区间的右端点时,两区间没有交集
            if(intervals[i][0]>end){
    
    
                //把当前区间左右端点添加到结果集中
                int []temp=new int[2];
                temp[0]=start;
                temp[1]=end;
                lists.add(temp);
                //更新当前区间左右端点
                start=intervals[i][0];
                end=intervals[i][1];
            //当选中的区间左端点小于等于当前区间的右端点时,两区间有交集
            }else{
    
    
                end=Math.max(intervals[i][1],end);
            }
        }
        //最终还需要把当前区间的左右端点添加到结果集中
        int []temp=new int[2];
        temp[0]=start;
        temp[1]=end;
        lists.add(temp);
        int reslen=lists.size();
        int [][]res=new int[reslen][2];
        //把动态数组的结果集加入到二维数组结果集中
        for(int i=0;i<reslen;i++){
    
    
            res[i][0]=lists.get(i)[0];
            res[i][1]=lists.get(i)[1];
        }
        return res;
    }

}

Supongo que te gusta

Origin blog.csdn.net/qq_39736597/article/details/113810653
Recomendado
Clasificación