頭條面試題: 區間合併

區間合併

問題

給出一個區間的集合,請合併所有重疊的區間。

示例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】回覆:‘加羣’加入刷題大隊,一起刷題
image.png

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