還是先看一道題:
一、解題思路
乙個區間可以表示為 [start, end],區間重疊區間排程問題,需要按 end 排序
,以便滿足貪心選擇性質。而對於區間合併問題,其實按 end 和 start 排序都可以
,不過為了清晰起見,我們選擇按 start 排序。
顯然,對於幾個相交區間合併後的結果區間 x,x.start 一定是這些相交區間中 start 最小的,x.end 一定是這些相交區間中 end 最大的。
由於已經排了序,x.start 很好確定,求 x.end 也很容易,可以模擬在陣列中找最大值的
過程:
int max_ele = arr[0]
;for
(int i =
1; i < arr.length; i++
) max_ele =
max(max_ele, arr[i]);
return max_ele;
二、完整**
# intervals 形如 [[1,3],[2,6]...]
defmerge
(intervals):if
not intervals:
return
# 按區間的 start 公升序排列
intervals.sort(key=
lambda intv: intv[0]
) res =
0])for i in
range(1
,len
(intervals)):
curr = intervals[i]
# res 中最後乙個元素的引用
last = res[-1
]if curr[0]
<= last[1]
:# 找到最大的 end
last[1]
=max
(last[1]
, curr[1]
)else
:# 處理下乙個待合併區間
return res
c++**:
class solution
//先對intervals的每個區間按第乙個元素(start)進行生序排序
sort
(intervals.
begin()
,intervals.
end(),
[&, this]
(vector<
int>
&v1, vector<
int>
&v2));
//遍歷整個陣列
for(
int i =
0; i < intervals.
size()
;++i)
//記錄結果
ret.
push_back
(temp);}
return ret;}}
;
至此,區間合併問題就解決了。 區間排程問題之區間合併
上篇文章用貪心演算法解決了區間排程問題 給你很多區間,讓你求其中的最大不重疊子集。我們解決區間問題的一般思路是先排序,然後觀察規律。乙個區間可以表示為 start,end 前文聊的區間排程問題,需要按end排序,以便滿足貪心選擇性質。而對於區間合併問題,其實按end和start排序都可以,不過為了清...
區間排程之區間 合併
思路按照區間的左端點,右端點從小道大排序。遍歷每乙個區間,若當前區間curr.start last.end,證明區間有可能有交集,需要更新上乙個區間last.end的值。若curr.start last.end 證明兩個區間不可能有交集。include include include using n...
區間排程之區間交集問題
區間排程問題共寫了3片部落格,前兩篇重疊區間和區間合併分別講了區間的最大不相交子集和重疊區間的合併,今天再寫乙個演算法,可以快速找出兩組區間的交集。一 解題思路 解決區間問題的思路一般是先排序,以便操作,不過題目說已經排好序了,那麼可以用兩個索引指標在 a 和 b 中游走,把交集找出來,大概是這樣的...