foreverys

导航

[LeetCode]646. 最长数对链

该题类似[LeetCode]300.最长递增子序列问题

方法一,动态规划

/*
解题思路
动态规划类单串LIS系列

特殊情况
pairs.length=1,直接返回1

解题步骤
1.pairs排序,pairs[i][0]从小到大排序,当pairs[i][0]相等时,按照pairs[i][1]从小到大排序

2.动态规划
定义状态
int[] lengths lengths[i]表示以pairs[i]结尾的数对能够形成的最长数对链
定义状态初始值
lengths[i]=1 i=0~pairs.length-1
定义状态转移方程
lengths[i]=max(lengths[j])+1 j<i,pairs[j][1]<pairs[i][0]
*/
class Solution {
    public int findLongestChain(int[][] pairs) {
        int N=pairs.length;
        int[] lengths;
        int ans=1;

        if(N<=1){
            return N;
        }
        // pairs数组排序
        Arrays.sort(pairs, new Comparator<int[]>(){
            public int compare(int[] a, int[] b){
                return a[0]==b[0]?a[1]-b[1]:a[0]-b[0];
            }
        });

        // 动态规划求解
        lengths=new int[N];
        Arrays.fill(lengths,1);
        for(int i=1; i<N; i++){
            for(int j=0; j<i; j++){
                if(pairs[j][1]<pairs[i][0] && lengths[i]<=lengths[j]){
                    lengths[i]=lengths[j]+1;
                }
            }
            ans=Math.max(ans, lengths[i]);
        }
        return ans;
    }
}

 

posted on 2020-11-10 08:02  foreverys  阅读(79)  评论(0编辑  收藏  举报