LeetCode第646题:最长连续递增序列

211 阅读1分钟

这是我参与更文挑战的第18天,活动详情查看: 更文挑战

题干

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

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

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

示例:

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

解法:动态规划

这道题其实其实还是最长自增递增序列问题。

与其不同的是,我们这道题的序列都是乱序,我们要想找到并记录连续对必须先要给其进行排序。之后我们按照前面数的第一位和后面数的第二位进行比较分析。

确定的递推公式为:

 dp[i] = Math.max(dp[j] + 1,dp[i])

注意这里是比较整条链上的最大情况。

代码实现:

执行用时:208 ms, 在所有 JavaScript 提交中击败了20.59%的用户

内存消耗:45.9 MB, 在所有 JavaScript 提交中击败了13.23%的用户

/**
 * @param {number[][]} pairs
 * @return {number}
 */
var findLongestChain = function (pairs) {
    pairs.sort((a,b)=>{
        return a[0]-b[0]
    })
    console.log(pairs)
    let len = pairs.length;
    if(len==1) return 1
    let dp = new Array(len).fill(1);
    dp[0] = 1;
    let maxNum=0;
    for (let i = 1; i < len; i++) {
        for (let j = 0; j < i; j++) {
            if (pairs[i][0] > pairs[j][1]) {
                dp[i] = Math.max(dp[j] + 1,dp[i])
            }
        }
        maxNum=Math.max(maxNum,dp[i])
    }
    return maxNum
};