前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >LeetCode 368. 最大整除子集(DP)

LeetCode 368. 最大整除子集(DP)

作者头像
Michael阿明
发布2020-07-13 15:18:41
6690
发布2020-07-13 15:18:41
举报

1. 题目

给出一个由无重复正整数组成的集合,找出其中最大的整除子集,子集中任意一对 (Si,Sj) 都要满足:Si % Sj = 0 或 Sj % Si = 0

如果有多个目标子集,返回其中任何一个均可。

代码语言:javascript
复制
示例 1:
输入: [1,2,3]
输出: [1,2] (当然, [1,3] 也正确)

示例 2:
输入: [1,2,4,8]
输出: [1,2,4,8]

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/largest-divisible-subset 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

类似题目:动态规划应用–最长递增子序列 LeetCode 300

  • 先排序,从后往前找能够整除的
  • 记录最大长度,同时记录最长的序列 前一个可以整除的 idx
  • 时间复杂度O(n2),空间复杂度O(n)
代码语言:javascript
复制
class Solution {
public:
    vector<int> largestDivisibleSubset(vector<int>& nums) {
        if(nums.empty()) return {};
    	sort(nums.begin(), nums.end());
    	int i, j, n = nums.size();
    	int maxlen = 1, maxlenid = 0;
    	vector<pair<int,int>> dp(n);//到该位置的最大长度,前一个idx
    	for(i = 0; i < n; ++i)
    		dp[i] = make_pair(1, -1);
    	for(i = 1; i < n; ++i)
    	{
    		for(j = i-1; j >= 0; --j)
    		{
    			if(nums[i]%nums[j] == 0 && dp[j].first+1 > dp[i].first)
    			{
    				dp[i].first = dp[j].first + 1;//最大长度
    				dp[i].second = j;//前一个数的idx
    			}
    		}
    		if(dp[i].first > maxlen)
    		{
    			maxlen = dp[i].first;//最大长度
    			maxlenid = i;//最大长度的结束数字
    		}
    	}
    	vector<int> ans(maxlen);
    	ans[maxlen-1] = nums[maxlenid];//最后一个数字
    	for(i = maxlen-2; i >= 0; --i)
    	{
    		ans[i] = nums[dp[maxlenid].second];//前一个数字
    		maxlenid = dp[maxlenid].second;//向前递推
    	}
    	return ans;
    }
};

52 ms 8.7 MB

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-06-17 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 题目
  • 2. 解题
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档