646. Maximum Length of Pair Chain(M)

题目描述

给定n对数,在每对数了,第一个数总是小于第二个数。现在我们定义,数对(c,d)能与数对(a,b)组成一条链且在(a,b)之后,当且仅当c>b时。给定一个数对的集合,求出这个集合中的最长数对链。不用使用完所有的数对,并且可以以任意的顺序选择数对加入链条中。
原题干以及例子如下,
这里写图片描述

首先,我们来提取题干中隐藏的一些信息。这是一个集合且后面强调了可以以任意的顺序选择数对,这表示数对的存放方式是无序的。同时这道题一看就要使用动态规划来做,当前状态和前一个状态紧密相连。这是两个关键信息一结合,肯定是要对这个集合排序的,不然根本用不上动态规划,因为要求当前元素要和前一个元素有联系,同时因为有了排序这一过程,对于时间复杂度便套上了一层限制,O(nlogn)。现在关键就是要怎么排序,根据什么来排序。排序的方法有很多种,主要是根据你考虑的动态规划方法来的。
这道题的动态规划我是参考例子来考虑的,既然两个元素如果能组成一条链要满足的关系为b < c,那么我们只要根据c的大小来排序,那么肯定是不会有遗漏的数对在后方的,保证了算法的完备性。因为如果数对的第一个数大于另一个数对的第二个数,那么这个数对的第一个数肯定也大于另一个数对的第一个数。
最后来我说明下如何进行动态规划。
现在我们已经根据排序的方法得到了一个有序的集合,那么我们从第一个元素开始遍历。如果后面的元素满足题目中的条件,即b > c,那么长度加一,如果不满足但是该元素的第二个元素小于c,那么令c等于该元素的第二个元素。下面,我来简单证明下。(建议结合代码来看)
假定集合存在a,b,c三个元素(<符号表示能够组成链条)
如果a < b,但是b 不小于 c,那么此时b,c能组成的最长链条长度都为2,因为b > a,所以b.first > a.second, 因为c.first > b.first,所以c处的链条长度等于b处的链条长度,这就是为什么即使c不大于b,最长链条也不会断的原因(即长度保持和b一样)。
下面是代码,

class Solution {
public:
    static bool compare(vector<int> a, vector<int> b) {
        return a[0] < b[0];
    }
    int findLongestChain(vector<vector<int>>& pairs) {
        int maxi = 1;
        int size = pairs.size();
        sort(pairs.begin(), pairs.end(), compare);
        vector<int> dp(size, 1);
        int end = pairs[0][1];
        for (int i = 1; i < size; ++i) {
            if (pairs[i][0] > end) {
                ++maxi;
                end = pairs[i][1];
            } else if (pairs[i][1] < end) {
                end = pairs[i][1];
            }
        }
        return maxi;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值