Leetcode 56 合併區間

2021-10-01 12:41:23 字數 1329 閱讀 4476

題目描述:

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

示例 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] 可被視為重疊區間。

思路:

首先要做的就是給區間集排序,由於我們要排序的是個結構體,所以我們要定義自己的comparator,才能用sort來排序,我們以start的值從小到大來排序,排完序我們就可以開始合併了,首先把第乙個區間存入結果中,然後從第二個開始遍歷區間集,如果結果中最後乙個區間和遍歷的當前區間無重疊,直接將當前區間存入結果中,如果有重疊,將結果中最後乙個區間的end值更新為結果中最後乙個區間的end和當前end值之中的較大值,然後繼續遍歷區間集,以此類推可以得到最終結果。

給兩種實現吧,主要是對列表遍歷時的操作不同。思想是一樣的

/**

* definition for an interval.

* public class interval

* interval(int s, int e)

* }*/class solution

});res.add(intervals.get(0));

for(int i=1;imerge(listintervals)

// 先對區間進行排序,使用乙個匿名內部類

collections.sort(intervals, new comparator()

});// 排序後,後乙個元素(記為next)的start一定是不小於前乙個(記為prev)start的,

// 對於新加入的區間,假設next.start大於prev.end就說明這兩個區間是分開的,要添

// 加乙個新的區間。否則說明next.start在[prev.start, prev.end]內。則僅僅要看

// next.end是否是大於prev.end,假設大於就要合併區間(擴大)

interval prev = null;

for (interval item : intervals) else if (prev.end < item.end)

}return result;

}}

Leetcode 56 合併區間

對所有區間按起點位置進行排序 遍歷到k點後的 l,r 已知的包含k點的最大區間 遍歷到k 1點,若該起點屬於 l,r 那麼可能擴充套件這個區間的終點,r max r,k 1點的end definition for an interval.struct interval interval int s,...

LeetCode 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 可被視為重疊區間。解題思路 1...

LeetCode 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 可被視為重疊區間。題意還是好理...