zoukankan      html  css  js  c++  java
  • 无重叠区间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);
        }
    }
  • 相关阅读:
    软件杯_视频全量目标分析和建模_初步分析
    《一线架构师实践指南》第三部分阅读笔记
    eclipse配置Struts2至Tomcat8.5
    《一线架构师实践指南》阅读笔记02
    Java中对list集合使用HashSet去重不成功
    学习02
    《一线架构师实践指南》阅读笔记01
    通过DOS命令将txt文件导入mysql数据库
    zookeeper集群环境搭建详细图文教程
    SSO之CAS单点登录详细搭建教程
  • 原文地址:https://www.cnblogs.com/goodtest2018/p/13630110.html
Copyright © 2011-2022 走看看