給定乙個無序的整數陣列,找到其中最長上公升子串行的長度。
示例:輸入: [10,9,2,5,3,7,101,18]
輸出: 4
解釋: 最長的上公升子串行是 [2,3,7,101],它的長度是 4。
暴力解法 列出所有子串行,再判斷這個子串行是不是上公升子串行
狀態和狀態轉移方程
狀態: 定義dp[i],表示以第i個數字為結尾的最長上公升子串行的長度
dp[i]表示範圍[0,i]內,選擇乙個新的數字nums[i],獲得的lis長度
這樣定義狀態以後,我們區間的擴充套件就可以依賴前乙個區間了
也就是說dp[i]表示[0,i],依賴於dpi-1 + 當前的數字nums[i]
狀態轉移方程
d p[
i]=m
ax(1
+dp[
i]if
nums
[i
]>nu
ms[j
]for
jin0
−>i)
dp[i] = max(1+dp[i] if nums[i] > nums[j] for j in 0 -> i)
dp[i]=
max(
1+dp
[i]i
fnum
s[i]
>nu
ms[j
]for
jin0
−>i)
class
solution
:def
longthoflis
(self,nums):if
len(nums)==0
:return
0 dp =[1
]*len(nums)
for i in
range(1
,len
(nums)):
dp[i]
=max([
1+dp[j]
for j in
range
(i)if nums[j]
< nums[i]]+
[1])
return
max(dp)
最長上公升子串行 LIS 演算法
開乙個棧,每次取棧頂元素top和讀到的元素temp做比較,如果temp top 則將temp入棧 如果temp top則二分查詢棧中的比temp大的第1個數,並用temp替換它。最長序列長度即為棧的大小top。這也是很好理解的,對於x和y,如果x y且stack y stack x 用stack x...
最長上公升子串行 LIS
題目 兩道題幾乎一樣,只不過對於輸入輸出的要求有所不同罷了。lis有兩種方法 一 第一種方法 時間複雜度為o n 2 狀態 dp i 區間為0 i的序列的lis 轉移方程 dp i max 1,dp k 1 0 k include include include include using name...
最長上公升子串行LIS
問題 給定n個整數a1,a2,a3,a4,a5,an,從左到右的順序盡量選出多個整數,組成乙個上公升子串行,相鄰元素不相等。例如 1,6,2,3,7,5,它的最長上公升子串行為 1,2,3,5。分析 剛開始想這個問題的時候我想用遞迴來解決問題,可是後來考慮到遞迴的時間複雜度高,就覺得不能使用,並且本...