646. 最长数对链(LIS&贪心)

Posted Harris-H

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了646. 最长数对链(LIS&贪心)相关的知识,希望对你有一定的参考价值。

646. 最长数对链(LIS&贪心)

首先pair排序。显然对于 ( a , b ) (a,b) (a,b) 只能选取 c ≤ a c\\le a ca ( c , d ) (c,d) (c,d)。若 c > a c>a c>a 则不满足 d < a d<a d<a

然后我们定义小于关系: p i < p j p_i<p_j pi<pj p i p_i pi的第二关键字小于 p j p_j pj的第一关键字。

因此转换为最长递增子序列,直接dp即可。

时间复杂度: O ( n l o g n ) O(nlogn) O(nlogn)

class Solution 
public:
    int findLongestChain(vector<vector<int>>& pairs) 
        sort(pairs.begin(), pairs.end());
        vector<int> arr;
        for (auto p : pairs) 
            int x = p[0], y = p[1];
            if (arr.size() == 0 || x > arr.back()) 
                arr.emplace_back(y);
             else 
                int idx = lower_bound(arr.begin(), arr.end(), x) - arr.begin();
                arr[idx] = min(arr[idx], y);
            
        
        return arr.size();
    
;

贪心的思路:第一个肯定选取 s e c o n d second second最小的,然后再剩下继续选满足条件的 s e c o n d second second最小的。因此按照 s e c o n d second second 排序贪心选即可。

class Solution 
public:
    int findLongestChain(vector<vector<int>>& pairs) 
        int curr = INT_MIN, res = 0;
        sort(pairs.begin(), pairs.end(), [](const vector<int> &a, const vector<int> &b) 
            return a[1] < b[1];
        );
        for (auto &p : pairs) 
            if (curr < p[0]) 
                curr = p[1];
                res++;
            
        
        return res;
    
;

以上是关于646. 最长数对链(LIS&贪心)的主要内容,如果未能解决你的问题,请参考以下文章

力扣646. 最长数对链 贪心法

LeetCode 646 最长数对链[贪心 自定义排序] HERODING的LeetCode之路

每日一题646. 最长数对链

646. 最长数对链

LeetCode题目记录-646. 最长数对链(C++代码实现)

LeetCode 0646. 最长数对链