leetcode 646. 最长数对链

给出 n 个数对。 在每一个数对中,第一个数字总是比第二个数字小。

现在,我们定义一种跟随关系,当且仅当 b < c 时,数对(c, d) 才可以跟在 (a, b) 后面。我们用这种形式来构造一个数对链。

给定一个对数集合,找出能够形成的最长数对链的长度。你不需要用到所有的数对,你可以以任何顺序选择其中的一些数对来构造。

示例 :

输入: [[1,2], [2,3], [3,4]]
输出: 2
解释: 最长的数对链是 [1,2] -> [3,4]
注意:

给出数对的个数在 [1, 1000] 范围内。

解题思路:一开始自己拿到这道题,是有点贪心的感觉,但是不知道如何sort,如何进行贪心,自己也不知道如何证明贪心的正确性,然后看了下 解题思路 : 将pair看成区间,问题转化为:删除某些区间,使得剩余的不相交区间最多

class Solution {
public:
    static bool cmp(vector<int> &a, vector<int> &b) {return a[1]<b[1];}
    int findLongestChain(vector<vector<int>>& pairs) {
        sort(pairs.begin(), pairs.end(), cmp);
        int len=pairs.size();
        if(len==0)
            return 0;
        int end=pairs[0][1],ans=1;
        for(int i=1;i<len;i++){
            if(pairs[i][0]>end){
                end=pairs[i][1];
                ans++;
            }
        }
        return ans;
    }
};

然后就用Dp,这个Dp也是要先排序的

1,先对数对进行排序,按照尾部数字进行从小到大排序
2,进行动态规划求解,dp[i]代表前i(从0开始计数)个数形成的最长数对数
状态转移方程
dp[i] = max{dp[i - 1], 1 + dp[j]} j为满足小于数对i且距离i最近的一个数对下标

class Solution {
public:
    int findLongestChain(vector<vector<int>>& pairs) {
        sort(pairs.begin(),pairs.end());
        vector<int > dp(pairs.size(),1);
        for(int i=1;i<pairs.size();i++){
            for(int j=0;j<i;j++){
                if(pairs[j][1]<pairs[i][0])
                    dp[i] = max(dp[i],dp[j] + 1);
            }
        }

            // cout<<pairs[i][0]<<" "<<pairs[i][1]<<endl;
            return dp[pairs.size()-1];
    }
};
发布了124 篇原创文章 · 获赞 47 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/ludan_xia/article/details/105187990