先对数组进行排序,用动态规划的思想,dp[i]表示以nums[i]结尾的最长的divisible subset。
首先dp[0] = [nums[0]]
更新dp[i]时,如果num[i]为之前某个数num[j](j<i)的倍数,则存在以nums[i]结尾,长度为dp[j] + 1的divisible subset。遍历nums[0]...nums[i-1],找出以nums[i]结尾的最长divisible subset。
class Solution(object):
def largestDivisibleSubset(self, nums):
"""
:type nums: List[int]
:rtype: List[int]
"""
if len(nums) <= 1:
return nums
nums.sort()
result = [nums[0]]
dic = [[nums[0]]]
for i in range(1, len(nums)):
num = nums[i]
temp = []
for item in dic:
if num % item[-1] == 0 and (len(item) + 1) > len(temp):
temp = item[:] + [num]
if not temp:
temp = [num]
dic.append(temp)
if len(temp) > len(result):
result = temp
return result