给出一个区间的集合,请合并全部重叠的区间。数组
示例 1:bash
输入: [[1,3],[2,6],[8,10],[15,18]]
输出: [[1,6],[8,10],[15,18]]
解释: 区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].
复制代码
示例 2:ide
输入: [[1,4],[4,5]]
输出: [[1,5]]
解释: 区间 [1,4] 和 [4,5] 可被视为重叠区间。
复制代码
解题思路: 将输入转为数组 , 而后定制比较函数对数组进行排序 , 用两个变量start , end记录当前遍历的区间 , 而后对数组进行遍历 , 若是end 大于等于 当前遍历值的start , 则进行归并 , 不然将start , end加入结果集, 并更新start 、end ; 小坑: 最后还要往结果集加入一次start 、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; }
* }
*/
class Solution {
public List<Interval> merge(List<Interval> intervals) {
List< Interval > res = new ArrayList<>();
if( intervals == null || intervals.size() == 0 ) {
return res;
}
Interval[] in = new Interval[ intervals.size() ];
intervals.toArray( in );
Arrays.sort( in , new Comparator<Interval>(){
@Override
public int compare( Interval o1 , Interval o2 ){
if( o1.start == o2.start ){
return o1.end - o2.end;
}
return o1.start - o2.start;
}
});
int start = in[ 0 ].start;
int end = in[ 0 ].end;
for( int i = 1; i < intervals.size() ; i++ ){
if( end >= in[ i ].start ){
end = end > in[ i ].end ? end : in[ i ].end ;
continue;
}
Interval tmp = new Interval( start , end );
res.add( tmp );
start = in[ i ].start;
end = in[ i ].end;
}
Interval tmp = new Interval( start , end );
res.add( tmp );
return res;
}
}
复制代码