leetcode 673 最長遞增子串行的個數

2021-09-12 14:37:08 字數 1430 閱讀 3862

給定乙個未排序的整數陣列,找到最長遞增子串行的個數。

示例 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

# 可以這樣初始化,比我的簡單很多

參考:

leetcode(42)-----673. 最長遞增子串行的個數

LeetCode 673 最長遞增子串行的個數

給定乙個未排序的整數陣列,找到最長遞增子串行的個數。示例 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。dp i ...

leetcode673 最長遞增子串行的個數

題目 這道題有點貪心?最優規劃?動態規劃?我也不知道叫啥了。就是從前往後算,後者的計算需要用到前者的值 原本想法,找到各個點的當前最長長度,找到最長的幾個值,然後倒推,後來覺得倒推太費時間,能不能在取最長值的時候,就把解拿到 就有了下面的 如果只要求最長長度 只需要int maxs new int ...

Leetcode 673 最長遞增子串行的個數

給定乙個未排序的整數陣列,找到最長遞增子串行的個數。示例 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。注意 給定...