日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

数组的合并和升序排列_区间调度问题之区间合并

發布時間:2024/9/27 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数组的合并和升序排列_区间调度问题之区间合并 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

讀完本文,你可以去力扣拿下如下題目:

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,歡迎標星!

總結

以上是生活随笔為你收集整理的数组的合并和升序排列_区间调度问题之区间合并的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。