思路:
想到一个词叫“传递性”,在这边应该也适用。就是如果b%a==0,然后c%b==0,那么肯定有c%a==0. 按照这个方法来构造一个集合就可以了,应该是动态规划的思想,results[i]保存包含数组元素nums[i]的最佳集合,构建集合的时候,首先从之前的results[j] (j=0…i-1)里面找到能够“传递”过来的集合(nums[i]%nums[i]==0)选作最佳(相当于找到c%b==0,当然这里的b是之前results[j]里面的最大元素,即nums[j])然后加上本身的nums[i]就构成了到第i个元素为止的最佳集合,如此继续…
时间复杂度应该是O(n^2)
class Solution {
public:
vector<int> largestDivisibleSubset(vector<int>& nums) {
if(nums.empty())
return nums;
sort(nums.begin(), nums.end());
int bestIndex = 0;
vector<vector<int>> results(nums.size());
for(int i=0; i<nums.size(); i++){
for(int j=0; j<i; j++){
//nums[j] < nums[i]
if(nums[i]%nums[j]==0 &&
results[i].size() < results[j].size())
results[i] = results[j];
}
results[i].push_back(nums[i]);
if(results[bestIndex].size() < results[i].size())
bestIndex = i;
}
return results[bestIndex];
}
};