给定一个未排序的整数数组,找到最长递增子序列的个数。
示例 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。
分析:
举个栗子:nums=[1,4,3,5,9,8,10]
先实例化 dp 和cnt为[1,1,1,1 ,1 ,1 ,1],
dp:分别存放以i为下标的元素构成的递增序列的最大长度
cnt:每个递增序列对应的子序列的个数
通过循环比较大小使得dp里的数据更新为递增序列的最大长度[ 1, 2 ,2 ,3 ,4 ,4, 5 ]
同时使 tn 更新为[1,1, 1,2,2,2,4 ]
现在递增的最大长度是max_len是 5,
最后取出在 tn 中和最大长度对应的数,就是最长递增子序列的个数。(只要是==max_len的序列都要计数,所以要+)
class Solution:
def findNumberOfLIS(self, nums):
res = 0
max_len = 1
# dp[i]是以第i个元素结尾的最长递增子序列的长度
dp = [1 for _ in range(len(nums))]
# 每个递增序列对应的子序列的个数
cnt = [1 for _ in range(len(nums))]
for i in range(1,len(nums)):
for j in range(i):
if nums[i]>nums[j] and dp[i] < dp[j]+1:
dp[i] = dp[j]+1
cnt[i] = cnt[j]
elif nums[i]>nums[j] and dp[i] == dp[j]+1:
cnt[i] += cnt[j]
max_len = max(max_len,dp[i])
# print(dp)
# print(cnt)
for k in range(len(nums)):
if dp[k] == max_len:
res += cnt[k]
return res
dp = [1] * n
tn = [1] * n
# 可以这样初始化,比我的简单很多
参考: