(M)Dynamic Programming:646. Maximum Length of Pair Chain

本文介绍了一种寻找最长链的算法实现,通过排序和动态规划思想解决配对问题。使用C++实现,详细解释了代码逻辑及关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我的思路:举个例子:[[1, 2], [2, 3], [3, 4], [4, 5]]

建立一个数组res,res[i]表示0~i个pair最长的链。那么如果res[i]和res[j]满足要求,那么就有一个链是res[j] + 1,遍历所有的满足要求的res[j]+1,最长的res[j] + 1就是res[i]。

但这样会有一个问题,比如[3, 4], [2, 3], [1,2]这样就找不到链,因为第一个对是最大的,后面没有比3大的了,所以要先排序,sort(pairs.begin(), pairs.end())默认按照第一个数排序。

class Solution {
public:
    int findLongestChain(vector<vector<int>>& pairs) {
        int pairnum = pairs.size();
        vector<int> res(pairnum, 0);
        if(pairnum < 2)
            return 0;
        sort(pairs.begin(), pairs.end());
        for(int i = 1; i < pairnum; ++i)
        {
            int max = 0;
            for(int j = i - 1; j >= 0; j--)
            {
                if(pairs[i][0] > pairs[j][1])
                {
                    res[i] = res[j] + 1;
                    if(res[i] > max)
                        max = res[i];
                }
            }
            res[i] = max;
        }
        return res[pairnum - 1] + 1;  //加1是因为,要求返回链的长度,找到的第一对满足要求的链,链长是2不是1
    }
};
补充一个二维vector的比较:

sort(pairs.begin(), pairs.end(), cmp);

static bool cmp(vector<int>& a, vector<int>&b) { return a[1] < b[1] || a[1] == b[1] && a[0] < b[0]; }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值