链接:
https://leetcode.com/problems/merge-intervals/
大意:
给定由一些区间(Interval)组成的类,要求合并所有重叠的区间。例子:
思路:
先对所有区间按照区间的起点由小到大排序。
记interval1和interval2为两个相邻区间(interval1.start <= interval2.start)。
若interval2.start <= interval1.end时,这两个区间有重叠,重叠之后的终点为Math.max(interval1.end, interval2.end)
若interval2.start > interval1.end时,这两个区间没有重叠。
因此可以设立两个变量s,e。分别表示记录当前包含重叠区间的起始点和终止点,然后对比当前遍历到的区间interval,看其 interval.start 与 e的关系。
代码:
/**
* 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) {
LinkedList<Interval> res = new LinkedList<>();
if (intervals.size() <= 1)
return intervals;
// 对每个区间按照start由小到大排序
Collections.sort(intervals, new Comparator<Interval>(){
public int compare(Interval i1, Interval i2){
return i1.start - i2.start;
}
});
int s = intervals.get(0).start, e = intervals.get(0).end;
for (int i = 1; i < intervals.size(); i++) {
// 后一个区间的s小于等于前一个区间的e时,证明两个区间有重叠 此时应该计算最新的e
if (intervals.get(i).start <= e) {
e = Math.max(intervals.get(i).end, e);
} else {
res.add(new Interval(s, e));
s = intervals.get(i).start;
e = intervals.get(i).end;
}
}
res.add(new Interval(s, e));
return res;
}
}
结果:
结论:
主要是找到什么样的两个区间是会有重叠