題目描述:
給出一個區間的集合,請合併所有重疊的區間。
示例 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] 可被視爲重疊區間。
解題思路:
1.先對二維數組的第一個數字進行排序;
2.設二維數組的第一個數爲left,第二個數爲right。i不能到最後一行,right和下一行的left比較大小對right重新賦值。最後得到的區間即爲合併的區間。
具體代碼如下:
class Solution {
public int[][] merge(int[][] intervals) {
if(intervals == null && intervals.length ==1){
return intervals;
}
//合併區間的形式爲 [[1,6],[8,10],[15,18]],因此使用ArrayList。
List<int[]> list = new ArrayList<>();
//對數組的第一個數進行比較,按從小到大的順序排列
Arrays.sort(intervals,new Comparator<int[]>(){
public int compare(int[] a,int[] b){
return a[0]-b[0];
}
});
int i=0;
int n=intervals.length;
while(i<n){
//left爲二維數組的第一個數,right爲二維數組的第二個數
int left = intervals[i][0];
int right = intervals[i][1];
//i不可能到最後一行,否則right和下一行數組的第一個數的比較就沒有意義
//right和下一行數組的left比較,對right重新賦值。
while(i<n-1 && right>=intervals[i+1][0]){
right = Math.max(right,intervals[i+1][1]);
i++;
}
//list存放的內容即爲合併區間後的內容。
list.add(new int[]{left,right});
i++;
}
return list.toArray(new int[list.size()][2]);
}
}
知識點:
1.代碼中使用了比較器Comparator,實際上是對compare方法進行了重寫。即當o1小於02,o1等於o2,o1大於o2分別返回-1,0,1。
public interface Comparator<T> {
int compare(T o1, T o2);
}