給定乙個無序的整數陣列,找到其中最長上公升子串行的長度。
示例:
輸入:[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
,因此建立乙個長度為n
的dp
陣列,這個陣列用來存放元素。
從左向右遍歷陣列nums
將元素插如dp
陣列中,由於要求最長上公升子串行的長度因此要使dp
陣列中元素最多並保持上公升狀態。
如果當前要加入的元素的插入位置在dp
陣列已加入元素的尾部,說明該元素比之前的元素都要大,比如dp=[2]
插入元素為5
,5>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...