solution/zui-chang-shang-sheng-zi-xu-lie-by-leetcode-soluti/
題目描述給定乙個無序的整數陣列,找到其中最長上公升子串行的長度。
示例:
輸入: [10,9,2,5,3,7,101,18]
輸出: 4
解釋: 最長的上公升子串行是 [2,3,7,101],它的長度是 4。
說明:可能會有多種最長上公升子串行的組合,你只需要輸出對應的長度即可。
你演算法的時間複雜度應該為 o(n2) 。
高階:你能將演算法的時間複雜度降低到 o(nlogn) 嗎?
人與人的差距咋就這麼大呢?我想這道題硬是想了好久。。。
動態規劃的難點在於,在還沒有開始進行動態規劃邏輯的編寫時,我們就需要明確dp
陣列的含義,動態規劃的目的是將乙個複雜的大問題分解成易於解決的小問題,dp
陣列的作用就是儲存子問題的結果,便於後續的大問題求解時,能夠直接呼叫該結果
既然本題中需要求整個陣列(nums
)的最長上公升序列,我們定義dp[i]
儲存子陣列nums[0]~nums[i]
的最長上公升子串行長度(一定要算上nums[i]
),當有了dp
陣列之後,我們需要求nums[0]~nums[i]
的最長上公升子串行長度時,只需要nums[0]~nums[i]
和dp[0]~dp[i-1]
就能求出dp[i]
,當求出整個陣列的dp
陣列之後,取dp
陣列中的最大值即是最長上公升子串行的長度
如何根據子陣列的最長上公升子串行下一步的最長上公升子串行呢?即如何根據nums[0]~nums[i]
和dp[0]~dp[i-1]
求出dp[i]
呢?我們使用for
迴圈遍歷nums[0]~nums[i-1]
(for (int j = 0; j < i; j++)
int[
] dp =
newint
[nums.length]
;// 陣列第 0 個元素的最長上公升子串行就是他本身,所以 dp[0] = 1
dp[0]
=1;// maxlength 用於記錄陣列最長上公升子串行的長度
int maxlength = dp[0]
;// 遍歷陣列中每個元素
for(
int i =
1; i < nums.length; i++)}
// dp[i] 的最大值
dp[i]
= maxvalue;
// 記錄此時的最長上公升子串行的長度
maxlength = math.
max(maxlength, dp[i]);
}return maxlength;
}}
最長上公升子串行
問題描述 乙個數的序列bi,當b1 b2 bs的時候,我們稱這個序列是上公升的。對於給定的乙個序列 a1,a2,an 我們可以得到一些上公升的子串行 ai1,ai2,aik 這裡1 i1 i2 ik n。比如,對於序列 1,7,3,5,9,4,8 有它的一些上公升子串行,如 1,7 3,4,8 等等...
最長上公升子串行
最長上公升子串行問題是各類資訊學競賽中的常見題型,也常常用來做介紹動態規劃演算法的引例,筆者接下來將會對poj上出現過的這類題目做乙個總結,並介紹解決lis問題的兩個常用 演算法 n 2 和 nlogn 問題描述 給出乙個序列a1,a2,a3,a4,a5,a6,a7.an,求它的乙個子串行 設為s1...
最長上公升子串行
最長上公升子串行問題 給出乙個由n個數組成的序列x 1.n 找出它的最長單調上公升子串行。即求最大的m和a1,a2 am,使得a1動態規劃求解思路分析 o n 2 經典的o n 2 的動態規劃演算法,設a i 表示序列中的第i個數,f i 表示從1到i這一段中以i結尾的最長上公升子串行的長度,初始時...