解题思路:这一题如果是简单的求最长的整除子集的个数的话,是很简单的一个题目,但是题目要求返回最长的整除子集,这时候就得考虑使用更多的内存去存储更多的信息了。这道题使用两部分的容易去存储信息。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;
}
};