【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]

 

posted @ 2018-04-18 23:53  seyjs  阅读(370)  评论(0编辑  收藏  举报