30. 最长数对链(Medium)
题目链接
解题思路
本题要求在数对数组中挑选一些数对,组成一个呈现上升形态的最长数对链。这可以转化为「最长递增子序列」模型。
与整数数组的区别在于,使用动态规划之前应先对数组排序。计算 dp[i] 时,需要知道所有左区间比 pairs[i] 的左区间小的链对。排序后只需往前遍历一遍即可。
- 状态表示:dp[i] 表示以 i 位置的数对为结尾时,最长数对链的长度。
- 状态转移方程:对于 dp[i],遍历 [0, i-1] 区间内数对下标 j,找出所有满足 pairs[j][1] < pairs[i][0] 的 j。取其中最大的 dp[j] 加上 1,即为以 i 位置为结尾的最长数对链。
- 初始化:全部初始化为 1。
- 填表顺序:从左往右。
- 返回值:返回整个 dp 表中的最大值。
C++ 代码实现
class Solution {
public:
int findLongestChain(vector<vector<int>>& pairs) {
sort(pairs.begin(), pairs.end()); // 升序
int n = pairs.size();
vector<int> dp(n, 1);
int res = 1;
for(int i = 1; i < n; i++) {
for(int j = 0; j < i; j++) {
if(pairs[i][0] > pairs[j][1]) {
dp[i] = max(dp[i], dp[j] + 1);
}
}
res = max(res, dp[i]);
}
res;
}
};


