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