码迷,mamicode.com
首页 > 其他好文 > 详细

【leetcode】368. Largest Divisible Subset

时间:2018-04-19 00:37:09      阅读:162      评论:0      收藏:0      [点我收藏+]

标签:解题思路   col   表达   ges   题目   这一   code   区间   表达式   

题目如下:

技术分享图片

解题思路: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]

 

【leetcode】368. Largest Divisible Subset

标签:解题思路   col   表达   ges   题目   这一   code   区间   表达式   

原文地址:https://www.cnblogs.com/seyjs/p/8878639.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!