题目描述:
给出一个区间的集合,请合并所有重叠的区间。
示例 1:
输入: [[1,3],[2,6],[8,10],[15,18]] 输出: [[1,6],[8,10],[15,18]] 解释: 区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].
示例 2:
输入: [[1,4],[4,5]] 输出: [[1,5]]
解释: 区间 [1,4] 和 [4,5] 可被视为重叠区间。
这道题目在校招的时候做到,是极宇舟天的笔试题目,上网一查发现是Leetcode原题,当时没有写出来,但后来仔细一想发现其实很简单。没写出来主要是没有充分利用Java的集合类思想,不过Leetcode有提示用集合类的代码。现在再重新写一遍。
/**
* Definition for an interval.
* public class Interval {
* int start;
* int end;
* Interval() { start = 0; end = 0; }
* Interval(int s, int e) { start = s; end = e; }
* }
*/
class Solution {
public List<Interval> merge(List<Interval> intervals) {
List<Interval> result = new ArrayList<Interval>();
Collections.sort(intervals, new Comparator<Interval>(){
public int compare(Interval i1, Interval i2) {
return i1.start - i2.start;
}
});
if(intervals.size()<1) return result;
if(intervals.size()==1) result.add(intervals.get(0));
Interval thisInterval = intervals.get(0);
for(int i = 1; i < intervals.size(); i++) {
//若满足条件,两个区间合并
if(intervals.get(i).start <= thisInterval.end) {
//排除一种特殊情况,intervals.get(i)是thisInterval的一个子集的情况
if(intervals.get(i).end > thisInterval.end){
thisInterval.end = intervals.get(i).end;
}
}else {
result.add(thisInterval);
thisInterval = intervals.get(i);
}
if(i == intervals.size() - 1) result.add(thisInterval);
}
return result;
}
}