无重叠区间:
package my; import java.util.Arrays; //435.无重叠区间 public class NoOverlapIntervals { int eraseOverlapIntervals(int[][] intervals){ //在主体函数里,先将区间按照起始时间的先后顺序排序,然后调用递归函数 Arrays.sort(intervals,(v1,v2) -> v1[0]-v2[0]); return eraseOverlapIntervals(-1,0,intervals); } //递归函数里,先检查是否已经处理完所有的区间, 是, 表明不需要删除操作,直接返回 int eraseOverlapIntervals(int previous,int current ,int[][] intervals){ if(current == intervals.length){ return 0; } int taken = Integer.MAX_VALUE , nottaken; if(previous == -1 || intervals[previous][1] <= intervals[current][0]){ //只有当previous, current 没有发生重叠的时候,才可以选择保留当前的区间current taken = eraseOverlapIntervals(current,current + 1, intervals); } //其他情况,可以考虑删除掉current 区间,看看删除了它之后会不会产生最后的结果 nottaken = eraseOverlapIntervals(previous , current + 1,intervals) + 1; return Math.min(taken ,nottaken); } public static void main(String[] args){ int[][] inte= {{1,4},{2,5},{4,9},{7,10},{11,45}}; NoOverlapIntervals noi = new NoOverlapIntervals(); int n = noi.eraseOverlapIntervals(inte); System.out.println(n); } }
二、
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}}; NoOverlapIntervals noi = new NoOverlapIntervals(); int n = noi.eraseOverlapIntervals(inte); System.out.println(n); } }