最長上公升子串行

2021-10-24 09:49:40 字數 1692 閱讀 2353

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結尾的最長上公升子串行的長度,初始時...