【leetcode】368. Largest Divisible Subset
题目如下:
解题思路:leetcode里面有很多这样类似的题目,本题是求能够整除的,还有求依次递增的,一增一减的等等,都是万变不离其宗。对于这一类题目,我都是采用动态规划的算法。这题怎么解呢?首先对nums按升序排序,然后创建一个dp数组,dp[i]表示从nums[0]~nums[i]区间符合题目条件的子集的最大长度(注意,子集中nums[i]是必定包含的),里面的每个元素赋初始值为1。那个我们很容易可以得到递推表达式:在j = [0,i-1]区间内,得到满足nums[i] % nums[j] 条件的max{dp[j]},那么dp[i] = dp[j] + 1。同时,因为题目要求的不是输出最大长度,而是输出最大子集,因此,再用一个数组记录遍历过程中符合条件的子集即可。
代码如下:
class Solution(object): def largestDivisibleSubset(self, nums): """ :type nums: List[int] :rtype: List[int] """ if len(nums) == 0: return [] nums.sort() dp = [1 for i in xrange(len(nums))] val = [[i] for i in nums] #记录所有符合条件的子集 maxInx = 0 maxV = 0 for i, v in enumerate(dp): for j in xrange(0, i): if nums[i] % nums[j] == 0: if dp[i] < dp[j] + 1: l = val[j][:] l.append(nums[i]) val[i] = l dp[i] = dp[j] + 1 if maxV < len(val[i]): maxInx = i maxV = len(val[i]) return val[maxInx]