合并区间

给出一个区间的集合,请合并全部重叠的区间。数组

示例 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;
    }
}
复制代码