1. 題目
2. 題意
題目很好理解,就是輸入多個時間碎片,現在需要儘可能把碎片進行合併,求合併後的結果。
3. 思路
一個比較容易想到的思路,維護一個當前的合併之後的時間碎片組
,通過遍歷所有的時間碎片,不斷向合併之後的時間碎片組加入新的時間碎片
,並將其進行合併整理
即可。最佳的時間複雜度爲O(n),即每次加入的碎片都可以進行合併,維護的合併之後的時間碎片組永遠只有一個碎片。最差的時間複雜度爲O(n²),即每次加入的碎片都無法進行合併,每次加入都只能與之前加入的所有碎片進行比較。
4. 解題代碼
public int[][] merge(int[][] intervals) {
// 當輸入爲空,或碎片數不大於1時,可直接飯回
if (intervals == null || intervals.length <= 1) {
return intervals;
}
// 加入第一塊時間碎片
List<int[]> lists = new ArrayList<>();
lists.add(intervals[0]);
// 遍歷所有的時間碎片
for (int i = 1; i < intervals.length; i++) {
int[] newInter = intervals[i];
// 與維護的合併後的時間碎片組進行新一輪的合併
for (int j = 0; j < lists.size(); j++) {
int[] oldInter = lists.get(j);
// 判斷兩個時間碎片是否有交集
if (overlap(oldInter, newInter)) {
// 有交集,即將原來的時間碎片與待放入的時間碎片進行合併
newInter[0] = Math.min(oldInter[0], newInter[0]);
newInter[1] = Math.max(oldInter[1], newInter[1]);
// 清除原來的時間碎片
lists.remove(j--);
}
}
// 將整合結果放入
lists.add(newInter);
}
return lists.toArray(new int[lists.size()][]);
}
/**
* 判斷兩個時間碎片是否有交集
*/
private boolean overlap(int[] oldInter, int[] newInter) {
return (oldInter[1] >= newInter[0] && newInter[1] >= oldInter[0]);
}