题目描述
给出一个区间的集合,请合并所有重叠的区间。
示例 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] 可被视为重叠区间。
题目解答
/**
*思路:
*1. 将每个区间按照start排序,在排序之后很容易看出那两个区间是重合的
*2. 如果前一个区间的end大于或者等于后一个区间的start,说明这两个区间是重合的
*3. 采用这样的方式合并两个区间:取第一个区间的start,两个区间中较大的那个end作为新的区间
*4. 设一个temp等于第一个区间,遍历剩下的区间,如果遇到重叠的,则将temp更新为merge以后的区间
*5. 这是还不要把merge加入到list中,因为有可能下一个区间和merge是有重叠的
*6. 直到遇到下一个区间内和temp不发生重叠的时候,将temp加入到list里面
*7. temp的值被赋为下一个区间
*
* 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<Interval>();
if(intervals.size() == 0)
return res;
//对区间按照start进行排序
Collections.sort(intervals, new Comparator<Interval>(){
public int compare(Interval a, Interval b){
return a.start - b.start;
}
});
Interval temp = intervals.get(0);
//如果intervals中只有一个元素
if(intervals.size() == 1){
res.add(temp);
return res;
}
for(int i = 1; i < intervals.size(); i++){
//判断是否有重叠
if(temp.end >= intervals.get(i).start){//有重叠
//合并两个区间
temp.end = Math.max(temp.end, intervals.get(i).end);
}else{//如果不重复的话
res.add(temp);
temp = intervals.get(i);
}
}
res.add(temp);
return res;
}
}