我是靠谱客的博主 傻傻小丸子,最近开发中收集的这篇文章主要介绍python--lintcode603.最长整除子集,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

描述

给一个由 无重复的正整数 组成的集合,找出满足任意两个元素 (Si, Sj) 都有 Si % Sj = 0 或 Sj % Si = 0 成立的最大子集

如果有多种解集,返回其中任意一个。

您在真实的面试中是否遇到过这个题?  是

样例

给一个数组 [1,2,3],返回 [1,2] 或 [1,3]
给一个数组 [1,2,4,8],返回 [1,2,4,8]

 

这一题的思路其实和上一题还蛮像的,只不过多了一步要往回找最长子集的每一个元素,上一题见:https://blog.csdn.net/wenqiwenqi123/article/details/81327682

所以同样的,这一题开一个dp数组,数组中第i个位置存的是以i为结尾的子序列里面包含的最长上升子序列的数字个数。那么有如下递推关系:

dp[i] = max{dp[j] + 1,dp[i]}     其中j < i && nums[i]%nums[j]==0

要记得一开始给数组排个序,最后多一步往回查找,见代码注释:

class Solution:
    """
    @param: nums: a set of distinct positive integers
    @return: the largest subset
    """
    def largestDivisibleSubset(self, nums):
        # write your code here
        dp=[1 for i in range(len(nums))]
        nums.sort()
        # dp数组的第i个元素记录以第i个元素为尾的最长子序列长度
        for i in range(1,len(nums)):
            for j in range(0,i):
                if(nums[i]%nums[j]==0 ):
                    dp[i]=max(dp[i],dp[j]+1)
        maxp=0
        index=-1
        # 找到全局最长子序列
        for i in range(len(dp)):
            if(dp[i]>=maxp):
                index=i
                maxp=dp[i]
        result=[]
        result.append(nums[index])
        # 找出最长子序列中所有元素,往回倒,若dp值变小了则就是
        pre=index
        while(index>=1 and pre>=0):
            if(dp[index]!=dp[pre]  and nums[index]%nums[pre]==0):
                result.append(nums[pre])
                index=pre
                pre=index-1
            else:
                pre-=1
        result.reverse()
        return result




s = Solution()
print(s.largestDivisibleSubset([1,2,8,9]))

 

最后

以上就是傻傻小丸子为你收集整理的python--lintcode603.最长整除子集的全部内容,希望文章能够帮你解决python--lintcode603.最长整除子集所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(62)

评论列表共有 0 条评论

立即
投稿
返回
顶部