example 1
陣列[1,3,5,4,7] 最長遞增子串行有[1,3,5,7]與[1,3,4,7]兩個長度為4的陣列
example 2
陣列[2,2,2,2,3]最長遞增子串行為[2,3],有4個
使用dp演算法,給定陣列[nums],最長遞增子串行長度:
l(i) = max(l(j) + 1) if nums[j] < nums[i] for 1<=j < i
def
findnumberoflis
(nums):
n = len(nums)
dp = [[1,1] for i in range(n)]
#dp[i][0] 儲存以下標i結尾的陣列的最長遞增子串行長度
#dp[i][i] 儲存以下表i結尾的最長遞增子串行的個數
max_for_all = 1
#初始化最大個數
for i, value in enumerate(nums):
cur_max, count = 1, 0
#cur_max 儲存當前遞增序列長度count紀錄最長長度的個數
for j in range(i):#遍歷子問題
if nums[j] < value:
if dp[j][0]+1 > cur_max:
cur_max = dp[j][0]+1
#更新當前最大長度
count = 0
#如果需要更新那麼說明這個最大長度是第一次出現
if dp[j][0]+1 == cur_max:
#如果最大長度又出現了,加上之前已有的次數dp[j][1]
count+=dp[j][1]
dp[i] = [cur_max, max(count, dp[i][1])]#更新dp
max_for_all = max(cur_max, max_for_all)
return sum([item[1] for item in dp if item[0]==max_for_all])#計算最長長度出現的總次數
nums=[1,3,5,4,7]
print(findnumberoflis(nums))
#output:2
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。注意 給定...
最長遞增子串行
這是微軟實習生筆試遇到的,題意 求乙個陣列中最長遞增子串行的長度。要求選擇該題最好演算法的時間複雜度和空間複雜度。答案 時間複雜度o nlgn 空間複雜度o n 這題明顯用動態規劃來解。假設在目標陣列array 的前i個元素中,以array i 元素為最大元素的遞增子串行的長度是lis i 那麼 遞...
最長遞增子串行
最長遞增子串行又叫做最長上公升子串行 子串行,正如lcs一樣,元素不一定要求連續。本節討論實現三種常見方法,主要是練手。題 求乙個一維陣列arr i 中的最長遞增子串行的長度,如在序列1,1,2,3,4,5,6,7中,最長遞增子串行長度為4,可以是1,2,4,6,也可以是 1,2,4,6。方法一 d...