題目鏈結
以陣列intervals
表示若干個區間的集合,其中單個區間為intervals[i] = [starti, endi]
。請你合併所有重疊的區間,並返回乙個不重疊的區間陣列,該陣列需恰好覆蓋輸入中的所有區間。
示例 1:
輸入:intervals =[[
1,3]
,[2,
6],[
8,10]
,[15,
18]]輸出:[[1
,6],
[8,10
],[15
,18]]
解釋:區間 [1,
3] 和 [2,
6] 重疊, 將它們合併為 [1,6].
示例 2:
輸入:intervals =[[
1,4]
,[4,
5]]輸出:[[1
,5]]
解釋:區間 [1,
4] 和 [4,
5] 可被視為重疊區間。
python解法
比如這種情況,既要分析乙個區間的左邊界,又要分析乙個區間的有邊界,十分複雜
於是我們將每個區間,按區間的左邊界,從小到大排列。
這樣子,我們只需要比較,前乙個區間的右邊界和後乙個區間的左邊界,來判斷是否要合併,最後合併後的區間的右邊界,取兩個有邊界的最大值。
class
solution
:def
merge
(self, intervals: list[list[
int]])
-> list[list[
int]]:
intervals.sort(key=
lambda x: x[0]
) merged =
for interval in intervals:
# 如果列表為空,或者當前區間與上一區間不重合,直接新增
ifnot merged or merged[-1
][1]
< interval[0]
:else
:# 否則的話,我們就可以與上一區間進行合併
merged[-1
][1]
=max
(merged[-1
][1]
, interval[1]
)return merged
其中
intervals.sort(key=
lambda x: x[0]
)
是按區間的左邊界,從小到大進行排序。後面的x是可以任意替換成可以表示變數的字元
c++解法
class
solution
public
: vector
int>>
merge
(vector
int>>
& intervals)
else res.
push_back
(intervals[i]);
}return res;}}
;
由於合併區間的左區間一定是res.back()小的
但是右區間不一定 ,所以要max(res.back()[1],intervals[i][1])
另外排序還可以使用lambda表示式
sort
(intervals.
begin()
, intervals.
end(),
(const vector<
int>
& a,
const vector<
int>
& b)
);
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 可被視為重疊區間。題意還是好理...