區間合併
問題
給出一個區間的集合,請合併所有重疊的區間。
示例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] 可被視爲重疊區間。
解題思路
由於給出的區間集合區間集合中存在交集的任意兩個集合[a,b] [c,d]需要滿足以下條件:
a < c 且 b > c
或
c < a 且 d > a
爲了簡化集合重疊問題,可以先基於集合的上界進行排序。集合重疊的條件簡化爲
c <= b
步驟如下
- 對數組進行排序
- 遍歷排序後的集合,合併重疊集合
- 輸出合併後的集合
代碼實現
public static int[][] merge(int[][] intervals) {
// 對intervals的區間上界進行排序
Arrays.sort(intervals, (a, b) -> a[0] - b[0]);
int left, right;
// 定義新的區間集合大小
int r = 0;
// 遍歷排序後的集合,合併重疊集合
for (int i = 0; i < intervals.length; i++) {
left = intervals[i][0];
right = intervals[i][1];
// 查找區間下界
while (i < intervals.length - 1 && intervals[i + 1][0] <= right) {
i++;
right = Math.max(right, intervals[i][1]);
}
// 緩存結果數據
intervals[r][0] = left;
intervals[r++][1] = right;
}
// 生成合並後的集合
int[][] result = new int[r][2];
for (int i = 0; i < r; i++) {
result[i][0] = intervals[i][0];
result[i][1] = intervals[i][1];
}
return result;
}
完整代碼上傳至github
https://github.com/tinet-shenjg/leetCode4J
刷題大隊
歡迎關注公衆號【程序員Alex】回覆:‘加羣’加入刷題大隊,一起刷題