
力扣368. 最大整除子集
发布日期:2021-05-07 15:55:53
浏览次数:20
分类:原创文章
本文共 2354 字,大约阅读时间需要 7 分钟。
给你一个由 无重复 正整数组成的集合 nums ,请你找出并返回其中最大的整除子集 answer ,子集中每一元素对 (answer[i], answer[j]) 都应当满足:answer[i] % answer[j] == 0 ,或answer[j] % answer[i] == 0如果存在多个有效解子集,返回其中任何一个均可。
示例 1:
输入:nums = [1,2,3]
输出:[1,2]
解释:[1,3] 也会被视为正确答案。
示例 2:
输入:nums = [1,2,4,8]
输出:[1,2,4,8]
动态规划问题:
当前问题:i个元素的最长整除子集
最后一步: i个元素的最长整除子集 = j个元素的最长整除子集 +1,满足nums[i]%nums[j] =0,这里的nums是进行过升序排列之后的
子问题:j个元素的最长整除子集
状态转移方程:f[i] = f[j]+1 and nums[i]%nums[j] = 0 f[i]表示i个元素的最长整除子集 g[i]=j 表示i的最大整除子集是从哪个元素转移来的
初始化和边界条件: f[0] = 1 f[1] = 1 g[i] = i
计算顺序:从0到i开始计算
python代码:
class Solution: def largestDivisibleSubset(self, nums: List[int]) -> List[int]: lens = len(nums) nums.sort() f,g = [0]*lens,[0]*lens for i in range(lens): length ,prev = 1,i for j in range(i): if nums[i]%nums[j]==0: if f[j]+1>length: length = f[j]+1 prev = j; f[i] = length #记录第i个元素的最长整除子集的长度 g[i] = prev #记录每个最长整除子是由哪个元素转移而来 # 找到每个元素对应的最长整除子集长度的最大值 maxlen=idx = -1 for i in range(lens): if f[i] >maxlen: maxlen = f[i] idx = i # 回溯 ans = [] while len(ans)<maxlen: ans.append(nums[idx]) idx = g[idx] return ans
C++
class Solution { public: vector<int> largestDivisibleSubset(vector<int>& nums) { int len = nums.size(); sort(nums.begin(),nums.end()); //动态规划找出最大子集的个数,最大子集中的最大整数 vector<int>dp(len,1); int maxSize= 1; int maxVal= dp[0]; for(int i =1;i<len;i++) { for(int j = 0;j<i;j++) { if(nums[i]%nums[j]==0) { dp[i] = max(dp[i],dp[j]+1); } } if(dp[i]>maxSize) { maxSize = dp[i]; maxVal = nums[i]; } } vector<int>res; if(maxSize ==1) { res.push_back(nums[0]); return res; } for(int i = len-1;i>=0&&maxSize>0;i--) { if(dp[i]==maxSize&&maxVal%nums[i]==0) { res.push_back(nums[i]); maxVal = nums[i]; maxSize--; } } return res; }};
发表评论
最新留言
路过按个爪印,很不错,赞一个!
[***.219.124.196]2025年04月13日 23时49分22秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Python根据程序名称结束进程
2019-03-04
C# 适配器模式
2019-03-04
二分查找与插入排序的结合使用
2019-03-04
71 简化路径(模拟、栈)
2019-03-04
892 三维形体的表面积(分析)
2019-03-04
40. 组合总和 II(dfs、set去重)
2019-03-04
16 最接近的三数之和(排序、双指针)
2019-03-04
1333 餐厅过滤器(treemap映射)
2019-03-04
python中的all函数
2019-03-04
1137 第 N 个泰波那契数(迭代、记忆性递归)
2019-03-04
279 完全平方数(dfs)
2019-03-04
279 完全平方数(bfs)
2019-03-04
222 完全二叉树的节点个数(递归)
2019-03-04
865 具有所有最深结点的最小子树(递归)
2019-03-04
738 单调递增的数字(找出逆序的位置)
2019-03-04
410 分割数组的最大值(二分查找、动态规划)
2019-03-04
875 爱吃香蕉的珂珂(二分查找)
2019-03-04
693 交替位二进制数(位运算)
2019-03-04
450 删除二叉搜索树中的节点(递归删除节点)
2019-03-04
769 最多能完成排序的块(分析)
2019-03-04