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

这道卡了我一天的题目。我自己想的思路是对的,但是没能从纷杂的if else中得到正确的结果,最后还是向官方题解妥协了。

题目

给定一个未排序的整数数组,找到最长递增子序列的个数。
不要求子序列是连续的。

思路

最开始我设想用一维dp数组,dp[i]代表从0-i这一段最长子序列的个数,发现并不好找递归方程。因为从i倒着比较0-i-1这些位置的最长子序列,只有最长子序列的个数(count)是不够的,起码还得知道最长子序列是有多长吧(length)。
于是设置length[i]为以i为结尾的最长子序列的长度,count[i]为结尾的最长子序列的个数。
那么,假设i < j:

  • 当nums[i] < nums[j] 的时候,以nums[i]为结尾的子序列都可以加到nums[j]的前面,所组成的新的子序列为length[i] +1 .那是否要用length[i] +1来更新length[j],取决于二者的大小。
  • 那如果此时length[j] == length[i]+1,则说明最长子序列的个数增加了count[i]个。
  • 如果nums[i] == nums【j】,则 以nums[i]为结尾的子序列的长度和个数,都能送给的length[j] 和count[j]。至于是否替换,还是取决于length[j]和length[i]的大小。
  • 初始化, 都设置为1.因为自身单个字符也算子串。
class Solution:
    def findNumberOfLIS(self, nums):
        n = len(nums)
        if n <=1:
            return n
        length = [1] * n
        count = [1] * n
        for j in range(n):
            for i in range(j):
                if nums[j] > nums[i]:
                    if length[i] >= length[j]:
                        length[j] = length[i] +1
                        count[j] = count[i]
                    elif length[i] +1 == length[j]:
                        count[j] += count[i]
                elif nums[j] == nums[i]:
                    if length[i] < length[j]:
                        length[i] = length[j]
                        count[i] = count[j]
        max_len = max(length)
        return sum(c for i, c in enumerate(count) if length[i] == max_len)


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值