題目連結(jié):
題目意譯:
你被給定一個由 n 個數(shù)對所組成的陣列 pairs,其中 pairs[i] = [lefti, righti] 且 lefti < righti。
一個數(shù)對 p2 = [c, d] 在另一數(shù)對 p1 = [a, b]「之後」,則代表 b < c。而我們可以按照這個方式形成一個連鎖數(shù)對。
回傳最長可以形成的連鎖數(shù)對之長度。
你不需要使用掉所有被給定的區(qū)間。你可以按任意順序選擇數(shù)對。
限制:
n == pairs.length
1 ≦ n ≦ 1000
-1000 ≦ lefti < righti ≦ 1000
範(fàn)例測資:
範(fàn)例 1:
輸入: pairs = [[1,2],[2,3],[3,4]]
輸出: 2
解釋: 最長的連鎖為 [1,2] -> [3,4]。
範(fàn)例 2:
輸入: pairs = [[1,2],[7,8],[4,5]]
輸出: 3
解釋: 最長的連鎖為 [1,2] -> [4,5] -> [7,8].
解題思維:
其實跟
這題非常地類似。只是現(xiàn)在不是求在數(shù)線上的覆蓋長度,而是要連鎖可以接多長,但精神是一樣的。
因此我們一樣可以單純地先按照右端點由小到大排序。
而我們知道必定存在一個最佳解是挑排序後的第一個數(shù)對。
為何?因為如果是挑另一個數(shù)對,則要嘛這個新數(shù)對與原本重疊、要嘛不重疊。如果重疊了則代表我們必定可以改挑第一個,因為根據(jù)排序的條件,其右端點必定不大於現(xiàn)在另挑的這個數(shù)對;如果不重疊,則如同前面的敘述,第一個的右端點必不大於現(xiàn)在的,因此甚至可以直接多挑第一個。因此可以從這個反證法看到命題為真。
然後我們可以「跳過」與第一個數(shù)對重疊的數(shù)對,直到遇到?jīng)]有重疊的為止,此時挑它也會是最佳解(重複以上論述即可)。然後就重複此步驟直到把所有數(shù)對看完為止。最後便可以得到最佳解的長度。
此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。