上篇文章用貪心演算法解決了區間排程問題:給你很多區間,讓你求其中的最大不重疊子集。
我們解決區間問題的一般思路是先排序,然後觀察規律。
乙個區間可以表示為[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]...]
def merge(intervals):
if not intervals: return
# 按區間的 start 公升序排列
intervals.sort(key=lambda intv: intv[0])
res =
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
看下動畫就一目了然了:
本文終,希望對你有幫助。
區間排程之區間合併問題
還是先看一道題 一 解題思路 乙個區間可以表示為 start,end 區間重疊區間排程問題,需要按 end 排序,以便滿足貪心選擇性質。而對於區間合併問題,其實按 end 和 start 排序都可以,不過為了清晰起見,我們選擇按 start 排序。顯然,對於幾個相交區間合併後的結果區間 x,x.st...
區間排程之區間 合併
思路按照區間的左端點,右端點從小道大排序。遍歷每乙個區間,若當前區間curr.start last.end,證明區間有可能有交集,需要更新上乙個區間last.end的值。若curr.start last.end 證明兩個區間不可能有交集。include include include using n...
區間排程之區間交集問題
區間排程問題共寫了3片部落格,前兩篇重疊區間和區間合併分別講了區間的最大不相交子集和重疊區間的合併,今天再寫乙個演算法,可以快速找出兩組區間的交集。一 解題思路 解決區間問題的思路一般是先排序,以便操作,不過題目說已經排好序了,那麼可以用兩個索引指標在 a 和 b 中游走,把交集找出來,大概是這樣的...