思路:
1,从区间集合 intvs 中选择一个区间 x,这个 x 是在当前所有区间中结束最早的(end 最小)。
2,把所有与 x 区间相交的区间从区间集合 intvs 中删除。
3,重复步骤 1 和 2,直到 intvs 为空为止。之前选出的那些 x 就是最大不相交子集。
class Solution {
public int eraseOverlapIntervals(int[][] intervals) {
return intervals.length - noOverlapIntervals(intervals);
}
public int noOverlapIntervals(int[][] intervals){
if(intervals.length == 0) return 0;
// 按 end 升序排序
Arrays.sort(intervals,new Comparator<int []>(){
public int compare(int[] a,int[] b){
return a[1]-b[1];
}
});
// 至少有一个区间不相交
int cnt = 1;
// 排序后,第一个区间就是 x
int end = intervals[0][1];
for(int [] interval : intervals){
if(interval[0] >= end){
cnt++;
// 找到下一个选择的区间了
end = interval[1];
}
}
return cnt;
}
}