646. 最长数对链

Posted hequnwang10

tags:

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

一、题目描述

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

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

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

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

二、解题

方法1:动态规划

dp[i]表示以pairs[i]为结尾的最长数对链的长度。

class Solution 
    public int findLongestChain(int[][] pairs) 
        if(pairs == null || pairs.length ==0)
            return 0;
        
        //首先将数对进行右边界升序
        Arrays.sort(pairs,new Comparator<int[]>()
            public int compare(int[] a,int[] b)
                return a[1]-b[1];
            
        );
        //动态规划数组,dp[i]表示以pairs[i]为结尾的最长数对链的长度
        int[] dp = new int[pairs.length];
        dp[0] = 1;
        for(int i = 1;i<pairs.length;i++)
            //第二层循环从0开始遍历,查看之前的数对是否小于当前的数对
            dp[i] = 1;
            for(int j = 0;j<i;j++)
                if(pairs[j][1] < pairs[i][0])
                    dp[i] = Math.max(dp[i],dp[j]+1);
                
            
        
        int res = 0;
        for(int num : dp)
            res = Math.max(res,num);
        
        return res;
    

方法2:贪心算法
class Solution 
    public int findLongestChain(int[][] pairs) 
        if(pairs == null || pairs.length ==0)
            return 0;
        
        //使用贪心算法 将复杂度降低至O(nlogn)
        //首先对右边界升序
        Arrays.sort(pairs,new Comparator<int[]>()
            public int compare(int[] a,int[] b)
                return a[1]-b[1];
            
        );
        //取第一个值的右边界值 后面更新
        int cur = pairs[0][1];
        //统计数对的长度
        int cnt = 1;
        //从第二个数对开始遍历
        for(int i =1;i<pairs.length;i++)
            if(pairs[i][0]>cur)
                cur = pairs[i][1];
                cnt++;
            
        
        return cnt;
    

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

646. 最长数对链

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

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

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

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

LeetCode 0646. 最长数对链