leetcode - 368. 最大整除子集

在这里插入图片描述
解题思路:这一题如果是简单的求最长的整除子集的个数的话,是很简单的一个题目,但是题目要求返回最长的整除子集,这时候就得考虑使用更多的内存去存储更多的信息了。这道题使用两部分的容易去存储信息。dp[i]表示以第i个整数结尾的最长整除子集的长度。bp[i]表示以第i个数字结尾的整除子集的上一个数字的索引。c++代码如下:

class Solution {
public:
    vector<int> largestDivisibleSubset(vector<int>& nums) {
        int length = nums.size();
        vector<int> res;  
        if(length==0)
            return res;  //如果集合的长度为零,返回一个空集
        sort(nums.begin(),nums.end());  //将集合进行排序
        vector<int> dp(length,1);  //表示以第i个数字结尾的最长整除子集的长度,初始化为1
        vector<int> bp(length,-1);  //表示以第i个数字结尾的整除子集的上一个数字的索引位置,初始化为-1
        for(int i=1;i<length;i++)  //跳过第一个数字
        {
            for(int j=i-1;j>=0;j--)  //循环前面i-1个数字
            {
                if(nums[i]%nums[j]==0)  //如果前面某个数字能被当前数字整除
                {
                    if(dp[i]<dp[j]+1)  //如果当前数字的最长子集小于前面某个数字的最长子集+1
                    {
                        dp[i] = dp[j] + 1;  //则更新当前数字的最长子集的长度
                        bp[i] = j;   //并且更新当前数字的前一个数字的索引
                    }
                }
            }
        }
        int index = 0;  //这一部分用于找到最长长度子集的索引位置
        for(int i=0;i<length;i++)
        {
            if(dp[index]<dp[i])
                index = i;
        }
        while(index!=-1)  //这一部分用于返回最长子集的内容
        {
            res.push_back(nums[index]);
            index = bp[index];
        }
        sort(res.begin(),res.end());  //这一段的作用是按从小到大排序,实际上不用也可以
        return res;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值