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();
// }
// }