Given a set of distinct positive integers nums, return the largest subset answer such that every pair (answer[i], answer[j]) of elements in this subset satisfies:
answer[i] % answer[j] == 0, oranswer[j] % answer[i] == 0If there are multiple solutions, return any of them.
Example 1:
Input: nums = [1,2,3]
Output: [1,2]Explanation: [1,3] is also accepted.
Example 2:
Input: nums = [1,2,4,8]
Output: [1,2,4,8]Constraints:
1 <= nums.length <= 10001 <= nums[i] <= 2,000,000,000nums are unique.class Solution:
def largestDivisibleSubset(self, nums: List[int]) -> List[int]:
nums.sort()
cache = {} # (i, prevIndex) -> List
def dfs(i, prevIndex):
if i == len(nums):
return []
if (i, prevIndex) in cache:
return cache[(i, prevIndex)]
res = dfs(i + 1, prevIndex) # Skip nums[i]
if prevIndex == -1 or nums[i] % nums[prevIndex] == 0:
tmp = [nums[i]] + dfs(i + 1, i) # Include nums[i]
res = tmp if len(tmp) > len(res) else res
cache[(i, prevIndex)] = res
return res
return dfs(0, -1)class Solution:
def largestDivisibleSubset(self, nums: List[int]) -> List[int]:
nums.sort()
cache = {}
def dfs(i):
if i in cache:
return cache[i]
res = [nums[i]]
for j in range(i + 1, len(nums)):
if nums[j] % nums[i] == 0:
tmp = [nums[i]] + dfs(j)
if len(tmp) > len(res):
res = tmp
cache[i] = res
return res
res = []
for i in range(len(nums)):
tmp = dfs(i)
if len(tmp) > len(res):
res = tmp
return resclass Solution:
def largestDivisibleSubset(self, nums: List[int]) -> List[int]:
nums.sort()
dp = [[num] for num in nums] # dp[i] = longest start at i
res = []
for i in range(len(nums) - 1, -1, -1):
for j in range(i + 1, len(nums)):
if nums[j] % nums[i] == 0:
tmp = [nums[i]] + dp[j]
dp[i] = tmp if len(tmp) > len(dp[i]) else dp[i]
res = dp[i] if len(dp[i]) > len(res) else res
return resclass Solution:
def largestDivisibleSubset(self, nums: List[int]) -> List[int]:
nums.sort()
n = len(nums)
dp = [[-1, -1] for _ in range(n)] # dp[i] = [maxLen, prevIdx]
def dfs(i):
if dp[i][0] != -1:
return dp[i][0]
dp[i][0] = 1
for j in range(i + 1, n):
if nums[j] % nums[i] == 0:
length = dfs(j) + 1
if length > dp[i][0]:
dp[i][0] = length
dp[i][1] = j
return dp[i][0]
max_len, start_index = 1, 0
for i in range(n):
if dfs(i) > max_len:
max_len = dfs(i)
start_index = i
subset = []
while start_index != -1:
subset.append(nums[start_index])
start_index = dp[start_index][1]
return subsetclass Solution:
def largestDivisibleSubset(self, nums: List[int]) -> List[int]:
nums.sort()
n = len(nums)
dp = [[1, -1] for _ in range(n)] # dp[i] = [maxLen, prevIdx]
max_len, start_index = 1, 0
for i in range(n):
for j in range(i):
if nums[i] % nums[j] == 0 and dp[j][0] + 1 > dp[i][0]:
dp[i][0] = dp[j][0] + 1
dp[i][1] = j
if dp[i][0] > max_len:
max_len = dp[i][0]
start_index = i
subset = []
while start_index != -1:
subset.append(nums[start_index])
start_index = dp[start_index][1]
return subset