368. Largest Divisible Subset
題目網址:https://leetcode.cn/problems/largest-divisible-subset/
題意:給一無重覆正整數組成的集合
nums
, 找出並返回其中最大的整除 subsetanswer
, 使得其中每一個 pair(answer[i], answer[j])
都應當滿足:
answer[i] % answer[j] == 0
或answer[j] % answer[i] == 0
如果存在多個 subset, 則返回其中一個即可。
Solution:
想法:利用 DP
1. 定義狀態:
- 首先, 會在
nums
前先加上一個0
, 代表什麼元素都沒有的狀態dp[i]
:在nums
為升序的前提下, 代表nums[1:i]
中以nums[i]
為結尾的最大整除 subset 之長度prev[i]
:代表nums[i]
是由哪一個 idx 的狀態轉移過來的, 以便回溯找出整個 subset2. 得到轉移方程:
- 若
nums[i] % nums[j] == 0
:則dp[i] = max(dp[i], dp[j] + 1)
, 其中1 ≤ j < i
3. 初始化:
dp[0]
:當沒有元素時, 最大整除 subset 之長度為0
dp[i]
:至少一個元素時, 以nums[i]
為結尾的最大整除 subset 之長度最小為1
, 其中1 ≤ i ≤ n
prev[1]
:為了讓idx
不斷往前回溯, 進而找出整個 subset。必須設一個終止條件, 將prev[1]
設為一個不可能會出現的數(由於prev[i]
存的是 idx, 故設為越界的 idx)
➔prev[1] = -1
class Solution { |
- time:$O(n^2)$ ➔ for loop
- space:$O(n)$ ➔
dp
,prev
本部落格所有文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 Zako's Blog!
評論