题目:
给出一个无重叠的按照区间起始端点排序的区间列表。
在列表中插入一个新的区间,你要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)。
样例
插入区间[2, 5] 到 [[1,2], [5,9]],我们得到 [[1,9]]。
插入区间[3, 4] 到 [[1,2], [5,9]],我们得到 [[1,2], [3,4], [5,9]]。
解题:
参考合并区间思想,可以将插入区间插入到列表中,再按照合并区间的思想解题
class Solution { /** * Insert newInterval into intervals. * @param intervals: Sorted interval list. * @param newInterval: A new interval. * @return: A new sorted interval list. */ public ArrayList<Interval> insert(ArrayList<Interval> intervals, Interval newInterval) { ArrayList<Interval> result = new ArrayList<Interval>(); if(intervals == null || intervals.size() <=0){ result.add(newInterval); return result; } intervals.add(newInterval); Collections.sort(intervals,new IntervalComparator()); Interval last = intervals.get(0); for(int i = 1;i<intervals.size();i++){ Interval cur = intervals.get(i); if(last.end>= cur.start){ last.end = Math.max(last.end,cur.end); }else{ result.add(last); last = cur; } } result.add(last); return result; } private class IntervalComparator implements Comparator<Interval>{ public int compare(Interval a,Interval b){ return a.start - b.start; } } }
原始已经有序,新加入元素后重新排序,没有这个必要了。
/** * Definition of Interval: * public classs Interval { * int start, end; * Interval(int start, int end) { * this.start = start; * this.end = end; * } */ class Solution { /** * Insert newInterval into intervals. * @param intervals: Sorted interval list. * @param newInterval: A new interval. * @return: A new sorted interval list. */ public ArrayList<Interval> insert(ArrayList<Interval> intervals, Interval newInterval) { ArrayList<Interval> result = new ArrayList<Interval>(); // write your code here if(intervals==null ||intervals.size()<=0){ result.add(newInterval); return result; } int insertPos = 0; for(int i=0;i<intervals.size();i++){ Interval curt = intervals.get(i); if(curt.end<newInterval.start){// 不相交 cur 后插入新区间 result.add(curt); insertPos++; } else if(curt.start>newInterval.end){// 不相交 cur 前插入新区间 result.add(curt); }else{ newInterval.start = Math.min(curt.start,newInterval.start); newInterval.end = Math.max(curt.end,newInterval.end); } } result.add(insertPos,newInterval); return result; } }
参考:http://www.jiuzhang.com/solutions/insert-interval/