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;
        
        }
  • 相关阅读:
    JPA与Hibernate的关系
    EJB里的问题解答
    EJB与JPA的关系
    EJB的魅惑来源
    EJB简介
    MyEclipse如何恢复删掉的文件
    EasyUI的功能树之扁平化
    EasyUI的功能树之异步树
    Spring AOP的日志记录
    简单理解IoC与DI
  • 原文地址:https://www.cnblogs.com/skillking/p/9660424.html
Copyright © 2011-2022 走看看