📅  最后修改于: 2023-12-03 15:26:26.226000             🧑  作者: Mango
最大长度链对是指一组链对,其中每对链对 (a, b) 满足 a[1] < b[1]。给定一组链对,找到由最多链对组成的最长链对序列。不一定要求每个链对都必须出现在序列中。
将所有的链对按照 b[1] 排序,然后使用贪心算法选取尽可能多的链对,使得它们构成的序列是一条单调递增的链。贪心策略是在满足单调递增条件的前提下,尽可能选择 b[1] 最小的链对。
具体实现时,我们可以按照 b[1] 排序后,使用动态规划的思路逐个选取链对,用 dp[i] 表示以第 i 个链对为结尾的最长链对序列的长度。状态转移方程为:
dp[i] = max(dp[j]) + 1,其中 j 是满足 b[j] < a[i] 的最大的索引。
最终的答案为 dp 中的最大值。
def findLongestChain(pairs: List[List[int]]) -> int:
pairs.sort(key=lambda x: x[1])
n = len(pairs)
dp = [1] * n
for i in range(1, n):
for j in range(i):
if pairs[j][1] < pairs[i][0]:
dp[i] = max(dp[i], dp[j] + 1)
return max(dp)
时间复杂度:O(n^2),其中 n 是链对的个数。
空间复杂度:O(n),动态规划数组的长度为 n。