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)


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章