class Solution { public: vector<int> largestDivisibleSubset(vector<int>& nums) { vector<int> dp(nums.size(),0); //dp[i] 代表 nums[i]在nums里面能够整除的数字个数 1,2,3, 里面 dp[2]代表index=2的数 3 能够整数的数有1个; vector<int> idx(nums.size(),0); //记录每个索引 if(nums.empty())return vector<int>(); sort(nums.begin(),nums.end()); //小到大排序 int imax=0,index=-1; dp[0]=1; for(int i=0;i<nums.size();++i) { dp[i]=1; //重要, 每个数i能被自己整除, 所以初始化为1 idx[i]=-1; //重要, 每个i位置上的索引初始化为-1代表没有被选中, 不赋值导致下面死循环 for(int j=i-1;j>=0;--j) { if(nums[i]%nums[j]==0) // 判断 i/j 是否整除
{ if(1+dp[j]>dp[i]) //循环1到j 找出 dp [1->j]里面最大的数 { dp[i]=dp[j]+1; //既然j能整除的数字有dp[j]个, 而i又能整除j, 毫无疑问i也能整除j能整除的所有数字, dp[i]=dp[j]+1 idx[i]=j; //更新索引为j, 可能有很多个符合条件的j, 这里只能记录第一个 } } } if(dp[i]>imax) //imax记录目前为止dpi的最大值 { imax=dp[i]; index=i; } } vector<int> r; while(index!=-1) //循环完后index是最后一个要被加入结果集的索引 { r.push_back(nums[index]); index=idx[index]; //相当于从后面往前面遍历 } return r; } };