题目链接:https://leetcode.com/problems/merge-intervals/
题目:
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].
解题思路:
- 先对 List 中的 Interval 对象,按 start 元素非严格单调递增排序。
- 然后依次比较相邻两个 Interval 对象。
- 若后者 start 小于等于前者,此时二者势必有重叠,再判断后者 end 是否大于前者 end
- 若后者 end 大于前者 end,表示两个对象间有相交的部分,合并二者,更新 end 值,形成新的“前者”
- 若后者 end 小于等于前者 end, 表示后者包含再前者之中,将后者抛弃即可
- 若后者 start 大于前者 start,表面二者并没有交集,将前者放入结果 List 中,后者变为新的“前者”
- 若后者 start 小于等于前者,此时二者势必有重叠,再判断后者 end 是否大于前者 end
代码实现:
/**
* 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; }
* }
*/
public class Solution {
public List<Interval> merge(List<Interval> intervals) {
if(intervals == null || intervals.size() == 0)
return intervals;
List<Interval> res = new ArrayList();
Collections.sort(intervals, new Comparator<Interval>() {
public int compare(Interval a, Interval b) {
return a.start - b.start;
}
});
int start = -1;
int end = -1;
for(Interval i : intervals) {
if(start == -1 && end == -1) {
start = i.start;
end = i.end;
} else {
if(i.start <= end) {
if(i.end > end)
end = i.end;
} else { // i.start > end
res.add(new Interval(start, end));
start = i.start;
end = i.end;
}
}
}
res.add(new Interval(start, end));
return res;
}
}
168 / 168 test cases passed.
Status: Accepted
Runtime: 15 ms