这道卡了我一天的题目。我自己想的思路是对的,但是没能从纷杂的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)