合并区间
题目链接:合并区间
思路:
- 这道题乍一看没什么头绪,不知从何下手,先看两个区间的合并,例如[1,3]和[2,6],怎么判断是否可以合并呢?当时我想的是,2在[1,3]之间,那么就可以合并,那么也就是下一个区间的start在当前区间的范围内就可以合并,但是如果颠倒了呢?显然就不正确了,即[2,6],[1,3],此时1不在[2,6]内。
- 那么这里发现的归律就是要先对区间的start排序,然后再判断区间是否可以合并。
- 这里出现的问题是,怎么对区间进行排序呢?javaSE中就学过使用继承Comparator类即可。
- 当出现区间不能合并时就将前一个区间存入结果集,使得每次只对两个区间进行合并操作。
public static List<Interval> merge(List<Interval> intervals) {
if(intervals.size()==0) {
return intervals;
}
List<Interval> result = new ArrayList<Interval>();
Collections.sort(intervals,new CompareInterval());//对集合进行排序
int left = intervals.get(0).start,right = intervals.get(0).end;
//遍历集合
for(int i=1;i<intervals.size();i++) {
if(intervals.get(i).start>=left&&intervals.get(i).start<=right) {
right = Math.max(right, intervals.get(i).end);
}else {
Interval temp = new Interval(left,right);
result.add(temp);
left = intervals.get(i).start;
right = intervals.get(i).end;
}
}
Interval temp = new Interval(left,right);
result.add(temp);
return result;
}
下面要另写一个比较类,或者通过内部类嵌入上面代码的类中也可以。
class CompareInterval implements Comparator<Interval>{
@Override
public int compare(Interval a, Interval b) {
return a.start-b.start;
}
}