前往
大廳
主題

LeetCode - 2580. Count Ways to Group Overlapping Ranges 解題心得

Not In My Back Yard | 2024-02-04 21:00:05 | 巴幣 0 | 人氣 53

題目連結:


題目意譯:
你被給定一個二維整數陣列 ranges,其中 ranges[i] = [starti, endi] 代表著第 i 個區段包含著所有介於 starti(含)到 endi(含)之間整數。

你需要將這些區段分成兩組群組(可能為空)使得:
    每一個區段屬於恰好一個群組、
    任兩個彼此重疊的區段屬於同一個群組。

兩個區段如果存在著至少一個整數同時出現於兩者之中,則這兩個區段「彼此重疊」。

例如,[1, 3] 和 [2, 5] 是彼此重疊的,因為 2 和 3 同時出現在兩個區段之中。

回傳將所有區段切成兩個群組的所有可行方法數。由於答案可能會很大,將其模 10 ^ 9 + 7 後再回傳。
(譯者注:這邊沒有寫明,但是兩個群組是「相異」個體。意即你把所有區段丟在「某個」群組和把所有區段丟到「另一個」群組是「不一樣」的方法。參見範例測資。)

限制:
1 ≦ ranges.length ≦ 10 ^ 5
ranges[i].length == 2
0 ≦ starti ≦ endi ≦ 10 ^ 9



範例測資:
範例 1:
輸入: ranges = [[6,10],[5,15]]
輸出: 2
解釋:
兩個區段彼此重疊,所以它們必須是在同一個群組中。
因此,有兩種可能的方式:
- 將兩個區段一起放到 1 號群組。
- 將兩個區段一起放到 2 號群組。

範例 2:
輸入: ranges = [[1,3],[10,20],[2,5],[4,8]]
輸出: 4
解釋:
區段 [1,3] 和 [2,5] 彼此重疊,所以它們必須是在同一個群組中。
而區段 [2,5] 和 [4,8] 彼此重疊,所以它們必須也是在同一個群組中。
因此,有四種可能的方式分組:
- 所有區段在 1 號群組。
- 所有區段在 2 號群組。
- 區段 [1,3] 、 [2,5] 和 [4,8] 在 1 號群組,而 [10,20] 在 2 號群組。
- 區段 [1,3] 、 [2,5] 和 [4,8] 在 2 號群組,而 [10,20] 在 1 號群組。


解題思維:
這題的想法加上併查集(Union-Find Set,參見這題的介紹)來將所有應在一起的區段先分出一些團體。這些團體內部的元素存在著另一個與其彼此重疊的元素,而對於團體外的元素則沒有。

假設有 c 個這樣子的團體,則答案即為 2 ^ c。記得用快速冪(參見這題古老心得文)來求此值並在過程中求模數。




此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

更多創作