300. Longest Increasing Subsequence
題目網址:https://leetcode.cn/problems/longest-increasing-subsequence/
題意:給一整數 array
nums
, 找出其中最長的嚴格遞增 subarray 之長度。進階:設計 $O(n \cdot log(n))$ time 的演算法
Solution 1:
想法:利用 DP
1. 定義狀態:
- 首先, 會在
nums
前先加上一個0
, 代表什麼元素都沒有的狀態dp[i]
:nums[1:i]
中 LIS 的長度2. 得到轉移方程:
dp[i] = max(dp[i], dp[j] + 1)
, for1 ≤ j < i
3. 初始化:
dp[0]
:當沒有元素時, LIS 的長度為0
dp[i]
:至少一個元素時, LIS 的長度最小為1
, 其中1 ≤ i ≤ n
res
:至少一個元素時, LIS 的長度最小為1
class Solution { |
- time:$O(n^2)$ ➔ for loop
- space:$O(n)$ ➔
dp
Solution 2:
想法:使用 DP + Greedy + Binary Search, 我們在乎只當前 subarray 的結尾
每當有一新數字
num
進來之後, 判斷num
是否比現在dp.back()
的數值大
- 若
num > dp.back()
, 那就直接放到dp.back()
的後面, 成為新的結尾- 否則, 用 Binary Search 找到
dp
中從左數來第一個大於num
的數字, 並將其替換掉。
(因為dp
結尾變小, 將來可能可以接得更長)
e.g. 下圖中紅框部分, 用5
取代8
, 使dp
結尾變小, 讓之後的6
能加入e.g.
nums = [3, 4, 1, 2, 8, 5, 6]
class Solution { |
- time:$O(n \cdot log(n))$ ➔ for loop, 其中
lower_bound()
是使用 Binary Search 實作的 - space:$O(n)$ ➔
dp
本部落格所有文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 Zako's Blog!
評論