leetCode 最長的上公升子串行

2021-10-10 15:56:05 字數 1982 閱讀 4476

給定乙個無序的整數陣列,找到其中最長上公升子串行的長度。

示例:

輸入:[10

,9,2

,5,3

,7,101,18

]輸出:

4 解釋: 最長的上公升子串行是 [2,

3,7,

101],它的長度是 4。

說明:

可能會有多種最長上公升子串行的組合,你只需要輸出對應的長度即可。

你演算法的時間複雜度應該為 o(n2) 。

高階: 你能將演算法的時間複雜度降低到 o(n log n) 嗎?

dp[i]代表以nums[i]結尾的陣列最長子序列的長度

例如陣列[10,9,2,5,3,7,101,18],假設已經知道了以下標index結尾的子陣列的最長子序列長度為x. 比如說index為6,也就是子陣列sub=[10,9,2,5,3,7,101],這時候x = 4 (2,3,7,101)如果這時後加上乙個數字18,這時求最長子序列的長度也就是要在子陣列sub=[10,9,2,5,3,7,101]使用乙個指標j從左向右遍歷,如果sub[j] < 18那麼就可以和18構成乙個子串行,也就是dp[j] + 1,加上18後dp[i] (這裡i為7)要取幾種情況中的最大值,所以狀態轉移方程為:

d p[

i]=m

ax(d

p[j]

+1)0

<=j

nums

[j

]

ms[i

]dp[i] = max(dp[j] + 1) 0<=j dp

[i]=

max(

dp[j

]+1)

0<=j

nums

[j]ms[i

]

class

solution

} dp[i]

= len;

maxlen = math.

max(maxlen, len);}

return maxlen;

}}

陣列nums的最長上公升子串行的長度,不會超過其本身的長度n,因此建立乙個長度為ndp陣列,這個陣列用來存放元素。

從左向右遍歷陣列nums將元素插如dp陣列中,由於要求最長上公升子串行的長度因此要使dp陣列中元素最多並保持上公升狀態。

如果當前要加入的元素的插入位置在dp陣列已加入元素的尾部,說明該元素比之前的元素都要大,比如dp=[2]插入元素為55>2因此插入在尾部dp=[2,5]

如果當前元素沒有比之前的元素都要大說明插入該元素不能使dp中序列的長度變長,比如說插入3, 此時3<5。因此需要查詢該元素在dp中的位置並替換該位置的元素,這樣dp中的序列就會減小就能右更多的元素插入在尾部,也就是說dp[2,5]變為[2,3]

要知道元素的插入位置可以使用二分查詢。

class

solution

dp[index]

= num;

if(index == len)

}return len;

}}

Dp 最長上公升子串 最長上公升子串行

乙個數的子串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,5,9 等等。這些子串中最長...

程式設計題 leetcode300 最長上公升子串行

題目鏈結 題目描述給定乙個無序的整數陣列,找到其中最長上公升子串行的長度。示例 輸入 10,9,2,5,3,7,101,18 輸出 4 解釋 最長的上公升子串行是 2,3,7,101 它的長度是 4。說明 可能會有多種最長上公升子串行的組合,你只需要輸出對應的長度即可。你演算法的時間複雜度應該為 o...

Leetcode最長上公升子串行LIS

理論 動態規劃初步 最長上公升子串行 lis 模板 void slove int first lower bound dp,dp n,inf dp printf d n dp first 1 printf d n first 題解 相當於求最長公共子串行,但是普通的演算法需要o n m 這道題目ta...