【LeetCode Top 100】56. Merge Intervals【Medium】【JAVA】

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]);
    }

5. 運行結果

在這裏插入圖片描述

6. 相關鏈接

本題代碼的github鏈接
其他 Top 100 Liked Questions 題目

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章