无重叠区间435

无重叠区间:

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

 

posted on 2020-09-08 00:30  凌晨三点半的飞机  阅读(183)  评论(0编辑  收藏  举报