合併區間

給出一個區間的集合,請合併全部重疊的區間。數組

示例 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;
    }
}
複製代碼
相關文章
相關標籤/搜索