前往
大廳
主題

LeetCode - 0646. Maximum Length of Pair Chain 解題心得

Not In My Back Yard | 2024-03-21 12:00:05 | 巴幣 0 | 人氣 43

題目連結:


題目意譯:
你被給定一個由 n 個數對所組成的陣列 pairs,其中 pairs[i] = [lefti, righti] 且 lefti < righti。

一個數對 p2 = [c, d] 在另一數對 p1 = [a, b]「之後」,則代表 b < c。而我們可以按照這個方式形成一個連鎖數對。

回傳最長可以形成的連鎖數對之長度。

你不需要使用掉所有被給定的區間。你可以按任意順序選擇數對。

限制:
n == pairs.length
1 ≦ n ≦ 1000
-1000 ≦ lefti < righti ≦ 1000



範例測資:
範例 1:
輸入: pairs = [[1,2],[2,3],[3,4]]
輸出: 2
解釋: 最長的連鎖為 [1,2] -> [3,4]。

範例 2:
輸入: pairs = [[1,2],[7,8],[4,5]]
輸出: 3
解釋: 最長的連鎖為 [1,2] -> [4,5] -> [7,8].


解題思維:
其實跟這題非常地類似。只是現在不是求在數線上的覆蓋長度,而是要連鎖可以接多長,但精神是一樣的。



因此我們一樣可以單純地先按照右端點由小到大排序。

而我們知道必定存在一個最佳解是挑排序後的第一個數對。

為何?因為如果是挑另一個數對,則要嘛這個新數對與原本重疊、要嘛不重疊。如果重疊了則代表我們必定可以改挑第一個,因為根據排序的條件,其右端點必定不大於現在另挑的這個數對;如果不重疊,則如同前面的敘述,第一個的右端點必不大於現在的,因此甚至可以直接多挑第一個。因此可以從這個反證法看到命題為真。

然後我們可以「跳過」與第一個數對重疊的數對,直到遇到沒有重疊的為止,此時挑它也會是最佳解(重複以上論述即可)。然後就重複此步驟直到把所有數對看完為止。最後便可以得到最佳解的長度。




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

創作回應

更多創作