难度:中等。
标签:数学,动态规划。
找最大整除子集,则这个集合按顺序排列,每一个数都可以整除前一个数。
因此,使用动态规划的思想,将输入升序排序,遍历每一个数,找出每一个数可以整除的数的集合,将当前数加入这些数中所在集合最大的数的集合中。
使用 d p [ i ] dp[i] dp[i]表示以 n u m s [ i ] nums[i] nums[i]为最大数的最大整除子集的元素个数, t r a c e [ i ] trace[i] trace[i]表示集合中上一个数的索引,用来追踪整个集合。
提交代码,错了三次,错误用例如下:
[3,4,16,8]
[4,8,10,240]
[2,3,8,9,27]
正确解法:
class Solution {
public:
vector<int> largestDivisibleSubset(vector<int>& nums) {
int n = nums.size();
if(n <= 1)return nums;
sort(nums.begin(), nums.end());
vector<int> dp(n);
vector<int> trace(n, -1);
for(int i = 0; i < n; ++i){
int maxNum = -1;
int flag = 1;
for(int j = i - 1; j >= 0; --j){
if(nums[i] % nums[j] == 0 && maxNum < dp[j]){
maxNum = dp[j];
dp[i] = dp[j] + 1;
trace[i] = j;
flag = 0;
}
}
if(flag)dp[i] = 1;
}
int idx = 0, maxV = 0;
for(int i = 0; i < n; ++i){
if(maxV < dp[i]){
maxV = dp[i];
idx = i;
}
}
vector<int> ans;
while(idx >= 0){
ans.insert(ans.begin(), nums[idx]);
idx = trace[idx];
}
return ans;
}
};
结果: