给出一个区间的集合,请合并所有重叠的区间。
示例 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] 可被视为重叠区间。复制代码
解题思路: 将输入转为数组 , 然后定制比较函数对数组进行排序 , 用两个变量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 Listmerge(List 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 (){ @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; }}复制代码