Sin intervalo de superposición java

Dado un conjunto de intervalos, encuentre el número mínimo de intervalos que deben eliminarse para que los intervalos restantes no se superpongan entre sí.

Nota:

Se puede considerar que el final de un intervalo es siempre mayor que su inicio.
Los límites de los intervalos [1,2] y [2,3] "se tocan" entre sí, pero no se superponen.
Ejemplo 1:

Entrada: [[1,2], [2,3], [3,4], [1,3]]

Salida: 1

Explicación: Después de eliminar [1,3], los intervalos restantes no se superponen.
Ejemplo 2:

Entrada: [[1,2], [1,2], [1,2]]

Salida: 2

Explicación: debe eliminar dos [1,2] para que los intervalos restantes no se superpongan.
Ejemplo 3:

Entrada: [[1,2], [2,3]]

Salida: 0

Explicación: no es necesario eliminar ningún intervalo, porque ya no se superponen.

Fuente: LeetCode
Enlace: https://leetcode-cn.com/problems/non-overlapping-intervals
Copyright es propiedad de LeetCode . Para reimpresiones comerciales, comuníquese con la autorización oficial. Para reimpresiones no comerciales, indique la fuente.

Idea: esta pregunta es codiciosa que dp, y el dp en esta pregunta es violento

class Solution {
    
    
    public int eraseOverlapIntervals(int[][] intervals) {
    
    
        if(intervals.length==0)
            return 0;
        //根据右边界进行排序
        //其实这题和用最少数量的箭引爆气球差不多
        Arrays.sort(intervals,new Comparator<int[]>(){
    
    
             public int compare(int[] interval1, int[] interval2) {
    
    
                 return interval1[1] - interval2[1];
             }
        });
        int n = intervals.length;
        int right = intervals[0][1];
        int res = 1;
        //这里得到的是不重复区间最多有几个
        for(int i=1;i<n;i++)
        {
    
    
            if(intervals[i][0]>=right)//如果左边界大于右边界说明没有重复
            {
    
    
                res++;
                right = intervals[i][1];
            }
        }
        return n-res;
    }
}
// class Solution {
    
    
//     public int eraseOverlapIntervals(int[][] intervals) {
    
    
//         if (intervals.length == 0) {
    
    
//             return 0;
//         }
        
//         Arrays.sort(intervals, new Comparator<int[]>() {
    
    
//             public int compare(int[] interval1, int[] interval2) {
    
    
//                 return interval1[0] - interval2[0];
//             }
//         });

//         int n = intervals.length;
//         int[] f = new int[n];
//         Arrays.fill(f, 1);
//         感觉这就有点暴力了,(题解描述)选出最多数量的区间,使得它们互不重叠
//         for (int i = 1; i < n; ++i) {
    
    
//             for (int j = 0; j < i; ++j) {
    
    
//                 if (intervals[j][1] <= intervals[i][0]) {
    
    
//                     f[i] = Math.max(f[i], f[j] + 1);
//                 }
//             }
//         }
//         return n - Arrays.stream(f).max().getAsInt();
//     }
// }


Supongo que te gusta

Origin blog.csdn.net/weixin_43824233/article/details/112004345
Recomendado
Clasificación