演算法強化 最長上公升子串行 LIS

2021-10-04 03:24:26 字數 1106 閱讀 1918

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

示例:輸入: [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。分析 剛開始想這個問題的時候我想用遞迴來解決問題,可是後來考慮到遞迴的時間複雜度高,就覺得不能使用,並且本...