删除重叠的区间的个数
package my; import java.util.Arrays; public class NoOverlapIntervals2 { int eraseOverlapIntervals(int[][] intervals){ if(intervals.length == 0){ return 0; } //将所有区间按照起始时间排序 Arrays.sort(intervals ,(v1,v2) -> v1[0] -v2[0]); //用一个变量end 记录前期的最小结束时间点, //以及一个count 变量记录到目前为止删除掉了多少区间 int end = intervals[0][1], count =0; //从第二个区间开始,判断一下当前区间和前一个区间的结束时间 for (int i = 1 ;i < intervals.length; i++){ //当前区间和前一个区间有重叠,即当前区间的起始时间小于上一个区间的结束时间, end 记录下两个结束时间的最小值 //把结束时间玩的区间删除,计数器加1. if(intervals[i][0] < end){ end = Math.min(end , intervals[i][1]); count++; }else{ end = intervals[i][1]; } } //如果没有发生重叠,根据贪婪法,更新end 变量为当前区间的结束时间 return count ; } public static void main(String[] args){ int[][] inte= {{1,4},{2,5},{4,9},{7,10},{11,45},{1,2}}; NoOverlapIntervals2 noi = new NoOverlapIntervals2(); int n = noi.eraseOverlapIntervals(inte); System.out.println(n); } }
//在给定区间中,最多有多少个区间相互之间是没有重叠的?
package my; import java.util.Arrays; //在给定区间中,最多有多少个区间相互之间是没有重叠的? public class NoOverlapIntervals3 { int eraseOverlapIntervals(int[][] intervals){ if(intervals.length == 0){ return 0; } //按照结束时间将所有区间进行排序 Arrays.sort(intervals ,(v1,v2) -> v1[1] -v2[1]); //定义一个变量end 用来记录当前的结束时间; //count变量用来记录有多少个没有重叠的区间; int end = intervals[0][1] ,count = 1; //从第二个区间开始遍历剩下的区间 for(int i= 1 ;i < intervals.length ; i++){ //当前区间和前一个结束时间没有重叠,那么计数器加1,同时更新一下新的结束时间 if(intervals[i][0] >= end){ end = intervals[i][1]; count ++; } } //用总区间的个数减去没有重叠的区间个数,即为最少要删除掉的区间个数 return intervals.length - count; } public static void main(String[] args){ int[][] inte= {{1,4},{2,5},{4,9},{7,10},{11,45},{1,2}}; NoOverlapIntervals3 noi = new NoOverlapIntervals3(); int n = noi.eraseOverlapIntervals(inte); System.out.println(n); } }