zoukankan      html  css  js  c++  java
  • 57. Insert Interval

    一、题目

      1、审题

      

      2、分析

        给出一组不重叠的间隔数字组成的数组,将一个新的间隔数组插入原来的数组,有重叠的部分则进行合并。

    二、解答

      1、思路:

        方法一、将 newInterval 插入原来的 List,再将 List 的数组进行重叠部分的合并。

      

    public List<Interval> insert(List<Interval> intervals, Interval newInterval) {
            
            intervals.add(newInterval);
                
            Collections.sort(intervals, new Comparator<Interval>() {
                @Override
                public int compare(Interval o1, Interval o2) {
                    return o1.start - o2.start;
                }
            });
            
            List<Interval> resultList = new ArrayList<Interval>();
            int start = intervals.get(0).start;
            int end = intervals.get(0).end;
            
            for(int i = 1; i < intervals.size(); i++) {
                Interval tmpInterval = intervals.get(i);
                if(end >= tmpInterval.start)    // 重叠
                    end = Math.max(end, tmpInterval.end);
                else {
                    resultList.add(new Interval(start, end));
                    start = tmpInterval.start;
                    end = tmpInterval.end;
                }
            }
            resultList.add(new Interval(start, end));
            return resultList;
        }

      

      方法二、 将 newInterval 与原 List 中的元素依次进行比较合并,可以分为三种情况:

          ①、List中 的 end < newInterval.start ,则没有重叠部分;

          ②、跳出①的循环后(已经开始有重叠的了),若 List 中 start <= newInterval.end, 则表示有重叠部分;

          ③、跳出②循环后,则 List 中剩下的元素与 newInterval 无重叠部分了。

    public List<Interval> insert(List<Interval> intervals, Interval newInterval) {
            
            List<Interval> result = new LinkedList<>();
            
            int i = 0;
            int len = intervals.size();
            
            // add all ending before newInterval starts
            while(i < len && intervals.get(i).end < newInterval.start)    
                result.add(intervals.get(i++));
            
             // merge all overlapping intervals to newInterval
            while(i < len && intervals.get(i).start <= newInterval.end) {
                newInterval = new Interval(
                        Math.min(newInterval.start, intervals.get(i).start),
                        Math.max(newInterval.end,  intervals.get(i).end));
                i++;
            }
            result.add(newInterval);
            
            // add the rest;
            while(i < len)
                result.add(intervals.get(i++));
            
            return result;
        
        }
  • 相关阅读:
    微软2019暑期实习笔试题
    java中函数传值和传地址的问题
    不常见的机器学习算法
    隐马尔可夫模型
    hive中over的用法
    SQL基本练习
    drop、truncate和delete的区别
    概率函数,分布函数,密度函数
    greenDao:操作数据库的开源框架
    利用百度API Store接口进行火车票查询
  • 原文地址:https://www.cnblogs.com/skillking/p/9660424.html
Copyright © 2011-2022 走看看