【Day 48 】2021-06-26 - 673. 最长递增子序列的个数

题目描述

673. 最长递增子序列的个数

入选理由

暂无

题目地址

https://leetcode-cn.com/problems/number-of-longest-increasing-subsequence/

前置知识

  • 动态规划

题目描述

给定一个未排序的整数数组,找到最长递增子序列的个数。

示例 1:

输入: [1,3,5,4,7]
输出: 2
解释: 有两个最长递增子序列,分别是 [1, 3, 4, 7] 和[1, 3, 5, 7]。
示例 2:

输入: [2,2,2,2,2]
输出: 5
解释: 最长递增子序列的长度是1,并且存在5个子序列的长度为1,因此输出5。
注意: 给定的数组长度不超过 2000 并且结果一定是32位有符号整数。

我的回答

解法一

时空复杂度

时间复杂度:O(n)

空间复杂度: O(n)

var findNumberOfLIS = function (nums) {
    let dp = Array(nums.length).fill(1)
    let count = Array(nums.length).fill(1)
    for (let i = 0; i < nums.length; i++) {
        for (let j = 0; j < i; j++) {
            if (nums[i] > nums[j]) {
                if ((dp[j] + 1) > dp[i]) {
                    dp[i] = dp[j] + 1
                    count[i] = count[j]
                } else if ((dp[j] + 1) === dp[i]) {
                    count[i] += count[j]
                }
            }
        }
    }
    const max = Math.max(...dp)
    let ans = 0
    for (let i = 0; i < nums.length; i++) if (dp[i] === max) ans += count[i]
    return ans
};

参考回答