Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 38 additions & 0 deletions 368/code.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
class Solution {
public:
// 时间复杂度:O(n^2)
// 其实只需要考虑一个整除的方向即可,即使前面较小的元素集合不正确,但是最终答案是正确的
vector<int> largestDivisibleSubset(vector<int>& nums) {
int len = nums.size();
if (len == 1) {
return nums;
}
// 方便进行dp,保证一个数整除比他小的数时,下标不会超过当前元素
sort(nums.begin(), nums.end());
unordered_map<int, vector<int>> mp;
mp.clear();
for (int i = 0; i < len; i++) {
vector<int> temp = {nums[i]};
mp[i] = temp;
for (int j = 0; j < i; j++) {
if (nums[i] % nums[j] == 0) {
// 可以进行转移
if (mp[j].size() + 1 > mp[i].size()) {
temp = mp[j];
temp.emplace_back(nums[i]);
mp[i] = temp;
}
}
}
}
int solve = 0;
vector<int> ans;
for (auto& it : mp) {
if ((it).second.size() > solve) {
solve = (it).second.size();
ans = (it).second;
}
}
return ans;
}
};
5 changes: 5 additions & 0 deletions 368/solution.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
#### 动态规划
* 原数组sort排序,保证了前面的数可以被后面的数整除,捋清乱序情况下数的整除关系
* 整除具有传递性,假设三个数a,b,c满足b%a=0 和c%b=0,那么必然存在c%a=0
* 根据上述传递性,我们可以写出转移方程,默认情况下dp[i] = {nums[i],} ,遍历j\<i,如果发现nums[i]%nums[j]=0,那么说明当前状态i可由状态j转移而来,更新状态i所对应的解即可
* 时间复杂度:O(nlogn + n^2 + n) = O(n^2)