56. 合併區間
給出一個區間的集合,請合併所有重疊的區間。
示例 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] 可被視爲重疊區間。
通過次數
71,934
提交次數
174,436
題解:
根據題目分析可知,如果我們按照區間的左端點排序,那麼在排完序的列表中,可以合併的區間一定是連續的。我們將排好序的數組進行循環遍歷,區間重合的進行合併,並用一個集合存放。
算法:
排好序的數組,對其進行合併區間判斷
while i < n
left = intervals[i][0]
right = intervals[i][1]
//此處判斷第i數組的右邊界是否大於第i+1數組的左邊界
while i < n-1 || right >= intervals[i+1][0]
//進行合併
right = Math.max(right,intervals[i+1][1])
i++
a = {left,right}
//將合併的數組放入ArrayList集合中
list.add(a)
i++
//集合轉數組
return list.toArray(new int[list.size()][2])
java代碼:
class Solution {
public int[][] merge(int[][] intervals) {
//判空
if(intervals==null||intervals.length<=1)
return intervals;
//定義集合接收合併數組
List<int[]> list=new ArrayList<>();
//對數組排序,這裏用了lamda表達式
Arrays.sort(intervals,(x,y)->x[0]-y[0]);
int i = 0, n = intervals.length;
while(i<n){
int l = intervals[i][0];
int r = intervals[i][1];
while(i<n-1&&r>=intervals[i+1][0]){
r = Math.max(r,intervals[i+1][1]);
i++;
}
int[] a={l,r};
list.add(a);
i++;
}
//集合轉數組
return list.toArray(new int[list.size()][2]);
}
}
程序運行效率:
此程序效率並不算高,若想查看更多優質代碼,請查看力扣官方題解。