题目
Given a collection of intervals, merge all overlapping intervals.
Example 1:
Input: [[1,3],[2,6],[8,10],[15,18]] Output: [[1,6],[8,10],[15,18]] Explanation: Since intervals [1,3] and [2,6] overlaps, merge them into [1,6].
Example 2:
Input: [[1,4],[4,5]] Output: [[1,5]] Explanation: Intervals [1,4] and [4,5] are considered overlapping.
十分钟尝试
没有想到思路,看了看思路,其实感觉应该能想到,只是没有花太多时间去思考,来梳理一下思路,写代码。
1. 先按照start排序,根据start判断是否重叠
2. 首先,发生overlap的情况是,第二个interval的start小于第一个interval的end
3 如果第二个interval的start小于第一个interval的end,那么end取两个interval的最大值。如果不小于,无重叠,继续遍历
这个问题其实是两个指针的思路,不断移动两个指针。
/**
* 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> res=new ArrayList();
if(intervals.size()==0) {
return res;
}
//按照start排序
intervals.sort((o1,o2)->Integer.compare(o1.start,o2.start));
//取出第一个元素
Interval firstInterval=intervals.get(0);
int start=firstInterval.start;
int end=firstInterval.end;
for(int i=1;i<intervals.size();i++){
Interval interval=intervals.get(i);
if(interval.start<=end){
//overlap重叠后修改边界,不用添加到res
end=Math.max(end,interval.end);
}
else{
//不重叠才会添加到res,添加上一个
res.add(new Interval(start,end));
start=interval.start;
end=interval.end;
}
}
res.add(new Interval(start,end));
return res;
}
}