這道卡了我一天的題目。我自己想的思路是對的,但是沒能從紛雜的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)