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. 最长数对链的主要内容,如果未能解决你的问题,请参考以下文章