间隔问题,合并间隔(merge interval),插入间隔(insert interval)
Merge Interval:
Given a collection of intervals, merge all overlapping intervals.
For example,
Given [1,3],[2,6],[8,10],[15,18]
,
return [1,6],[8,10],[15,18]
.
算法分析:首先要对给定序列排序。然后再去遍历合并。
class Interval { int start; int end; Interval() { start = 0; end = 0; } Interval(int s, int e) { start = s; end = e; } } public class MergeIntervals { public List<Interval> merge(List<Interval> intervals) { List<Interval> res = new ArrayList<>(); if(intervals == null || intervals.size() == 0) { return res; } Collections.sort(intervals, new Comparator<Interval>()//自定义比较方法,外部实现Comparator接口 { public int compare(Interval i1, Interval i2) { if(i1.start != i2.start) { return i1.start - i2.start; } else { return i1.end - i2.end; } } }); Interval pre = intervals.get(0); for(int i = 0; i < intervals.size(); i ++) { Interval curr = intervals.get(i); if(curr.start > pre.end) { res.add(pre); pre = curr; } else { Interval merged = new Interval(pre.start, Math.max(pre.end, curr.end)); pre = merged; } } res.add(pre); return res; } }
Insert Interval:
Given a set of non-overlapping intervals, insert a new interval into the intervals (merge if necessary).
You may assume that the intervals were initially sorted according to their start times.
Example 1:
Given intervals [1,3],[6,9]
, insert and merge [2,5]
in as [1,5],[6,9]
.
Example 2:
Given [1,2],[3,5],[6,7],[8,10],[12,16]
, insert and merge [4,9]
in as [1,2],[3,10],[12,16]
.
This is because the new interval [4,9]
overlaps with [3,5],[6,7],[8,10]
.
给定间隔序列和插入间隔,默认给定间隔序列有序,返回合并后的不重叠的间隔序列。是上一道题的变形。
public class InsertInterval { public List<Interval> insert(List<Interval> intervals, Interval newInterval) { List<Interval> res = new ArrayList<>(); for (Interval interval : intervals) { if(interval.end < newInterval.start) { res.add(interval); } else if(interval.start > newInterval.end) { res.add(newInterval); newInterval = interval; } else if(interval.start <= newInterval.end || interval.end >= newInterval.start) { newInterval = new Interval(Math.min(interval.start, newInterval.start),Math.max(interval.end, newInterval.end)); } } res.add(newInterval); return res; } }