题目描述:
给出 n 个数对。 在每一个数对中,第一个数字总是比第二个数字小。
现在,我们定义一种跟随关系,当且仅当 b < c 时,数对(c, d) 才可以跟在 (a, b) 后面。我们用这种形式来构造一个数对链。
给定一个对数集合,找出能够形成的最长数对链的长度。你不需要用到所有的数对,你可以以任何顺序选择其中的一些数对来构造。
示例 :
输入: [[1,2], [2,3], [3,4]]
输出: 2
解释: 最长的数对链是 [1,2] -> [3,4]
注意:
给出数对的个数在 [1, 1000] 范围内。
方法1:
主要思路:
(1)使用贪心算法;
(2)将原数组使用第二维进行升序排序,在第二维相等的情形下,使用第一维度进行排序;
(3)然后直接遍历数组,当下一个数组的第一个元素大于当前的最大值时,可以将当前数组加入链中;
class Solution {
public:
int findLongestChain(vector<vector<int>>& pairs) {
//排序
sort(pairs.begin(),pairs.end(),[](vector<int>& lhs,vector<int>&rhs){
return lhs[1]<rhs[1]||(lhs[1]==rhs[1]&&lhs[0]<rhs[0]);
});
int count=1;
int end_num=pairs[0][1];
//贪心统计
for(vector<int>& vec:pairs){
if(vec[0]>end_num){
end_num=vec[1];
++count;
}
}
return count;
}
};
方法2:
主要思路:
(1)动态规划;
(2)首先将数组进行排序,声明动态数组 dp[ i ],所有初始值置为1,dp[ i ] 表示前 i 个组合下,可以形成的最长的链,则对于当前的 dp [ i ],则可能的最大值,是在当前的对的左点大于之前的第 j 个数组的 右点时,才可能进行更新,既在pairs[i][0]>pairs[j][1]时,才可能有dp[i]=max(dp[i],dp[j]+1);
class Solution {
public:
int findLongestChain(vector<vector<int>>& pairs) {
sort(pairs.begin(),pairs.end());//排序
vector<int>dp(pairs.size(),1);//动态数组
int max_res=0;
//动态转移
for(int i=1;i<dp.size();++i){
for(int j=0;j<i;++j){
if(pairs[i][0]>pairs[j][1]){
dp[i]=max(dp[i],dp[j]+1);
}
}
max_res=max(max_res,dp[i]);
}
return max_res;
}
};
167

被折叠的 条评论
为什么被折叠?



