動態規劃 最長遞增子串行 思路及解法

2021-09-26 02:21:21 字數 1009 閱讀 9018

給定陣列arr,返回arr的最長遞增子串行。

arr = [2,1,5,3,6,4,8,9,7],返回的最長遞增子串行為[1,3,4,8,9],長度為5。

思路解析來自左神的《程式源**面試指南》;

這裡介紹的是時間複雜度為o(n2),額外空間複雜度o(n)的方法:

1.陣列arr的長度n,建立陣列dp,其中dp[i]的含義是,以arr[i]這個數結尾的情況下,即a[0…i]這段陣列中,最長的遞增子串行的長度是多少;

2.設定dp陣列的初值,即dp[0] = 1,因為當i = 0時,arr[0]只有乙個元素,所以最長的子串行長度就是1;

3.如果當前位置為i,假設其為最後乙個元素,那麼在此之前的所有小於arr[i]的元素都可以作為倒數第二個元素;所以我們只需要找到所有可能的位置,再在dp陣列中找到最大的那個值dp[k],那麼dp[i] = dp[k] + 1;

4.最後關於怎麼找到最長子序列:當我們將dp陣列構建完成,每個位置都是對應arr中每個位置的最長子序列的長度,所以我們只需要遍歷陣列,找到最大長度和其位置i,然後從arr[i - 1]向前開始判斷。假設最後子串行的陣列為lis,其長度len = dp[i],那麼dp[lis[len - 2]] + 1= dp[lis[len - 1]];這樣就能確定前乙個元素的位置了;具體可以看**,很容易理解;

public static int solution(int arr) 

public static int genedp(int arr) }}

return dp;

}public static int genelis(int arr,int dp)

}int lis = new int[len];

lis[--len] = arr[index];

while (dp[index] > 1) }}

lis[0] = arr[index];

return lis;

}

動態規劃 最長遞增子串行

給出序列 1 2 3 4 2 5 3 4 a 1 1,a 2 2,a 7 3,a 8 4 求其最長的遞增子串行,以上最長遞增子串行為 1 2 3 4 5 問題細分 初始化條件f 1 1,序列只有1個長度即為1 f 2 a 2 與下標小於2的比較,即a 1 比較,a 2 a 1 因此更新f 2 f 1...

動態規劃 最長遞增子串行

給定乙個無序的整數陣列,找到其中最長上公升子串行的長度 例項 輸入 10,9,2,5,3,7,101,18 輸出 4 解釋 最長的上公升子串行為 2,3,7,101 長度為4說明 可能會有多種最長上公升子串行的和,只需要輸出對應長度即可 演算法的時間複雜度應為o n2 首先,dp陣列的定義如下 dp...

動態規劃 最長遞增子串行

最長遞增子串行是動態規劃中最經典的問題之一,該問題描述的是在乙個已知序列中,取出若干元素 不必連續 組成乙個新的序列,子串行的各個數先後順序保持不變,且對子序列中的任意下標x令dp i 表示以a i 作為末尾的最長遞增子串行的長度。於是,通過設定這麼乙個陣列,最長遞增子串行的長度便是陣列dp中的最大...