步步高升 最長遞增子序列 Longest Increasing Subsequence_DP_Leetcode #300

小松鼠
發佈於演算法專欄 個房間
閱讀時間約 1 分鐘

題目敘述 Longest Increasing Subsequence

給定一個輸入陣列nums,要求我們計算出最長遞增子序列的長度是多少?

註:

子序列 不要求連續,可以把題目想成是找出一組遞增數列,而且數列長度是最長的。


測試範例

Example 1:

Input: nums = [10,9,2,5,3,7,101,18]
Output: 4
Explanation: The longest increasing subsequence is [2,3,7,101], therefore the length is 4.

2 -> 3 -> 7 -> 101
2 -> 3 -> 7 -> 18
2 -> 5 -> 7 -> 101
2 -> 5 -> 7 -> 18
上述四條皆為最長遞增子序列,長度=4

Example 2:

Input: nums = [0,1,0,3,2,3]
Output: 4

0 -> 1 -> 2 -> 3
最長遞增子序列長度 = 4

Example 3:

Input: nums = [7,7,7,7,7,7,7]
Output: 1

大家都一樣,沒辦法造出更長的數列了。
最長遞增子序列長度 = 1

約束條件

Constraints:

  • 1 <= nums.length <= 2500

輸入陣列長度介於1~2500之間。

  • -10^4 <= nums[i] <= 10^4

每個陣列元素介於 負一萬~正一萬 之間。


本題的教學影片



觀察

題目說要找最長遞增子序列,相當於找最長的遞增數列

假如我現在當下在index i,擁有的數字是nums[i]

可以回頭看,往左邊看那些比較小的index,
看看有沒有比我(nums[i])還小的數字num[k] ?

假如有的話,就可以試著從前面延伸過來,並且更新遞增子序列的長度。

每個index i 都可以依循同樣的邏輯做檢查和更新。


演算法 DP動態規劃 + 回頭看的技巧

怎麼定義DP狀態?

承接剛剛觀察點的思考,可以定義DP[i] = 以 index i 為終點的遞增子序列長度。


怎麼推導DP狀態轉移關係式?

假如左手邊有比較小的數字可以延伸過來,那就可以試著延伸、更新遞增子序列的長度。

DP[i] = max( DP[i], DP[k] + 1) 如果存在某個 k < i 且 nums[k] < nums[i]


初始條件(終止條件)為何?

最差情況下,就是左手邊的數字都比自己大,或者 和自己相等。
這時候,遞增子序列只有自己,遞增子序列的長度=1

DP[i] = 1


OK,到這邊,DP狀態定義、狀態轉移關係式、初始條件都具備了!

轉成對應的程式碼即可。


程式碼 DP動態規劃 + 回頭看的技巧

class Solution:
def lengthOfLIS(self, nums: List[int]) -> int:

size = len(nums)

# default value is 1, because each array element itself can be smallest LIS with length = 1
len_LIS = [1 for _ in range(size)]

# for each subsequence ending at index i
for i in range(size):

# for each prefix subsequence ending at k
for k in range(i):

if nums[k] < nums[i]:

# check if we can extend LIS length from prefix subsequence
len_LIS[i] = max(len_LIS[i], len_LIS[k]+1)


return max(len_LIS)


複雜度分析

時間複雜度:O(n^2)

雙層迴圈,外層迭代index i,內層迭代index k,O(n) * O(n) = O(n^2)


空間複雜度: O(n)

DP table len_LIS 所需空間大小為O(n)線性級別。


關鍵知識點

使用到數列題實用的"回頭看"的技巧,回頭找符合條件的元素。
在這題,就是回頭看,找比較小的元素。


Reference

[1] Longest Increasing Subsequence - LeetCode


回到DP特訓班目錄 和 學習路徑

52會員
339內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言0
查看全部
發表第一個留言支持創作者!
你可能也想看
打造全台最長32M雙軌滑索 中市飛行美樂地特色遊戲場開工2024.05.06 台中市政府 盧秀燕市長致力推動 「台中美樂地計畫」 ,市府建設團隊 將過去舊有的水湳機場基地,打造成結合飛行體驗及機場意象的「飛行美樂地」特色遊樂場,副祕書長林育鴻今(6)日代市長盧秀燕主持開工典禮。建設局指出,此次遊戲場以「未來飛行」概念呼應場域歷史精神,導入主題式飛行組合
Thumbnail
avatar
分埔少年
2024-05-06
地球上最長壽的地區在哪裡? 長壽村的定義?人類,是哺乳類中第二長壽的生物。 哺乳類中目前發現最長壽的生物,是生活在北極海中的弓頭鯨,可以活到將近200歲。 隨著文明的演進,人類有了更多的事情可以做,因此人們對於壽命無限延長的渴望也越來越強烈。今天,我們要來聊聊,地球上,最長壽的地區。 首先,我們可以從三個面向,來探討長壽這件事。
Thumbnail
avatar
提琉比長壽村
2024-04-28
開市---祝福在職場努力的你,2024工作都能順利完成,步步高升年收豐厚。法蘭克在這裡先祝福大家新的一年,工作順利 職場如意
Thumbnail
avatar
職場法蘭克
2024-02-15
撈生,撈一個步步高升,撈一個風生水起關於春節圍爐必備的年菜,台灣人偏好「佛跳墻」,而新加坡與馬來西亞華人則鍾愛「撈生」。「撈」是攪拌,「生」是魚生,撈生意即將生魚片跟其他食材攪拌在一起,因此又名「撈魚生」。另外,撈生的佐料通常會有七種顔色的蔬果絲,所以也有人會稱之為「七彩撈生」。
Thumbnail
avatar
XJ Studio
2024-02-01
讓你在工作上可以步步高升,年年加薪的技巧之前有朋友常常問我說,你們公司投入眾多的教育訓練資源。 你在公司這麼久,上過這麼多的課程,哪一個是可以讓工作上面可以更好上手? 可以讓人脫胎換骨呢? 自己回想了一些,上過這麼多的課程,到底哪一個是實際有效的工作術呢? 我說還真的有一個很好的課程,如果做得好,還真的可以讓你步步高升,年年加薪!!
Thumbnail
avatar
Pedor Chang
2023-04-21
【京典臻品】 紫水晶洞 / 紫晶洞 11.82KG 步步高升紫水晶 對應七輪中的眉輪,有助於開智慧、集中思考、增進記憶力,並且 紫晶洞 內的水晶彼此共振所形成的磁場,更是使 紫水晶 能量又更上一層。因此 巴西紫晶洞 不論是放在家中書房或辦公室,都能讓 紫水晶洞 為我們的思考帶來助益,對於需要長時間消耗腦力的學生或上班族都非常適合入手!
Thumbnail
avatar
京典臻品 JD CLASSIC
2023-02-02
【神畫能量】-鯉魚躍龍門 (工作事業順利、步步高升)在2010年那年的夏天,沒畫過”國畫”的陽光,連墨都不會調,但透過無形老師伏筆的過程中,最後出來的”成品”,倒是讓陽光跟雲兒都傻眼,雲兒說:「人家要學很久才會畫國畫,你沒學過就畫成這樣,要是去學一下,不是嚇死人了這…叫別人情何以堪。」 老實說,我也不知道這算不算國畫,問了朋友,朋友說沒問題的,他們學
Thumbnail
avatar
陽光先生
2022-12-02
【隋唐天下-步步高升宇文述】《大唐雙龍傳》的第一個魔王,叫做宇文化及。在歷史上,宇文化及就是殺了隋煬帝楊廣的辣個男人。 隋朝啊,是隋文帝楊堅篡北周而建立的。北周的國姓,就是宇文氏。 這該說是天理循環,報應不爽嗎? 很有趣的是,關於宇文化及的身世,有兩個不同說法。
Thumbnail
avatar
阿前
2022-08-13
年後轉職嗎?做好5件事讓你在職場步步高升年後轉職嗎?該領的年終獎金到手了,不少朋友在討論轉職,頻繁轉職,是我近幾年的寫照,但今年我沒有離開,從臨時人員的不定期契約,到受長官青睞而成為編制內人員,不過兩年時間,回顧這些日子的作為有些「特別」的眉角想與讀者分享。想獲得長官們的信賴,讓自己在職場工作中步步高升,這5件事缺一不可。
Thumbnail
avatar
茶布斯閱世界
2022-02-26