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

动态规划

要注意统计个数的时候,dp相等时要把之前的数量累加上,dp大的时候则是直接继承之前的数量。

时间复杂度: O(N^2)
空间复杂度:O(N)

func findNumberOfLIS(nums []int) int {
    n := len(nums)
    dp := make([]int, n)
    count := make([]int, n)
    maxLength := 0
    ans := 0

    for i := 0; i < n; i++ {
        dp[i] = 1
        count[i] = 1

        for j := 0; j < i; j++ {
            if nums[i] > nums[j] {
                if dp[j] + 1 == dp[i] {
                    // j位置的所有个数都要加上
                    count[i] += count[j]
                }
                if dp[j] + 1 > dp[i] {
                    dp[i] = dp[j] + 1
                    // 针对j位置的每一种最长子序列都有一个对应的新序列
                    count[i] = count[j]
                }
            }
            
        }

        // 所有最长的子序和都要考虑
        if dp[i] == maxLength {
            ans += count[i]
        }
        if dp[i] > maxLength {
            maxLength = dp[i]
            ans = count[i]
        }
    }

    return ans
}```

673.最长递增子序列的个数
https://blog.jerrylee.me/2021/09/a47563a515f0.html
作者
Jerry Lee
发布于
2021年9月20日
许可协议