[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; } }