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;
    
    }
原文地址:https://www.cnblogs.com/skillking/p/9660424.html