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