数组的合并和升序排列_区间调度问题之区间合并
讀完本文,你可以去力扣拿下如下題目:
56.合并區間
-----------
上篇文章用貪心算法解決了區間調度問題:給你很多區間,讓你求其中的最大不重疊子集。
其實對于區間相關的問題,還有很多其他類型,本文就來講講區間合并問題(Merge Interval)。
LeetCode 第 56 題就是一道相關問題,題目很好理解:
我們解決區間問題的一般思路是先排序,然后觀察規律。
PS:我認真寫了 100 多篇原創,手把手刷 200 道力扣題目,全部發布在 labuladong的算法小抄,持續更新。建議收藏,按照我的文章順序刷題,掌握各種算法套路后投再入題海就如魚得水了。
一、思路
一個區間可以表示為 [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 = []res.append(intervals[0])for i in range(1, len(intervals)):curr = intervals[i]# res 中最后一個元素的引用last = res[-1]if curr[0] <= last[1]:# 找到最大的 endlast[1] = max(last[1], curr[1])else:# 處理下一個待合并區間res.append(curr)return res看下動畫就一目了然了:
至此,區間合并問題就解決了。本文篇幅短小,因為區間合并只是區間問題的一個類型,后續還有一些區間問題。本想把所有問題類型都總結在一篇文章,但有讀者反應,長文只會收藏不會看… 所以還是分成小短文吧,讀者有什么看法可以在留言板留言交流。
本文終,希望對你有幫助。
_____________
我的 在線電子書 有 100 篇原創文章,手把手帶刷 200 道力扣題目,建議收藏!對應的 GitHub 算法倉庫 已經獲得了 70k star,歡迎標星!
總結
以上是生活随笔為你收集整理的数组的合并和升序排列_区间调度问题之区间合并的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java关键字—instanceof
- 下一篇: python工作目录_Python目录的