数组的合并和升序排列_区间调度问题之区间合并
讀完本文,你可以去力扣拿下如下題目:
56.合并區(qū)間
-----------
上篇文章用貪心算法解決了區(qū)間調(diào)度問(wèn)題:給你很多區(qū)間,讓你求其中的最大不重疊子集。
其實(shí)對(duì)于區(qū)間相關(guān)的問(wèn)題,還有很多其他類型,本文就來(lái)講講區(qū)間合并問(wèn)題(Merge Interval)。
LeetCode 第 56 題就是一道相關(guān)問(wèn)題,題目很好理解:
我們解決區(qū)間問(wèn)題的一般思路是先排序,然后觀察規(guī)律。
PS:我認(rèn)真寫(xiě)了 100 多篇原創(chuàng),手把手刷 200 道力扣題目,全部發(fā)布在 labuladong的算法小抄,持續(xù)更新。建議收藏,按照我的文章順序刷題,掌握各種算法套路后投再入題海就如魚(yú)得水了。
一、思路
一個(gè)區(qū)間可以表示為 [start, end],前文聊的區(qū)間調(diào)度問(wèn)題,需要按 end 排序,以便滿足貪心選擇性質(zhì)。而對(duì)于區(qū)間合并問(wèn)題,其實(shí)按 end 和 start 排序都可以,不過(guò)為了清晰起見(jiàn),我們選擇按 start 排序。
顯然,對(duì)于幾個(gè)相交區(qū)間合并后的結(jié)果區(qū)間 x,x.start 一定是這些相交區(qū)間中 start 最小的,x.end 一定是這些相交區(qū)間中 end 最大的。
由于已經(jīng)排了序,x.start 很好確定,求 x.end 也很容易,可以類比在數(shù)組中找最大值的過(guò)程:
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 []# 按區(qū)間的 start 升序排列intervals.sort(key=lambda intv: intv[0])res = []res.append(intervals[0])for i in range(1, len(intervals)):curr = intervals[i]# res 中最后一個(gè)元素的引用last = res[-1]if curr[0] <= last[1]:# 找到最大的 endlast[1] = max(last[1], curr[1])else:# 處理下一個(gè)待合并區(qū)間res.append(curr)return res看下動(dòng)畫(huà)就一目了然了:
至此,區(qū)間合并問(wèn)題就解決了。本文篇幅短小,因?yàn)閰^(qū)間合并只是區(qū)間問(wèn)題的一個(gè)類型,后續(xù)還有一些區(qū)間問(wèn)題。本想把所有問(wèn)題類型都總結(jié)在一篇文章,但有讀者反應(yīng),長(zhǎng)文只會(huì)收藏不會(huì)看… 所以還是分成小短文吧,讀者有什么看法可以在留言板留言交流。
本文終,希望對(duì)你有幫助。
_____________
我的 在線電子書(shū) 有 100 篇原創(chuàng)文章,手把手帶刷 200 道力扣題目,建議收藏!對(duì)應(yīng)的 GitHub 算法倉(cāng)庫(kù) 已經(jīng)獲得了 70k star,歡迎標(biāo)星!
總結(jié)
以上是生活随笔為你收集整理的数组的合并和升序排列_区间调度问题之区间合并的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Java关键字—instanceof
- 下一篇: 编写一个C程序,实现以下功能:定义一个学