給出一個區間的集合,請合併全部重疊的區間。數組
示例 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;
}
}
複製代碼