368. 最大整除子集
无重复整数,元素串成一个链,元素与元素之间的关系是倍数关系,做法类似于最长上升子序列。
时间复杂度:
O
(
n
2
)
O(n^2)
O(n2)
class Solution {
public:
vector<int> largestDivisibleSubset(vector<int>& nums) {
sort(nums.begin(), nums.end());
int n = nums.size();
vector<int> dp(n,1);
for(int i = 1; i < n; i++) {
for(int j = 0; j < i; j++) {
if(nums[i] % nums[j] == 0) {
dp[i] = max(dp[i], dp[j] + 1);
}
}
}
int mx = *max_element(dp.begin(), dp.end());
vector<int> ans;
// 根据转移关系倒推过去即可。
for(int i = n - 1; i >= 0; i--) {
if(dp[i] == mx && (ans.empty() || ans.back() % nums[i] == 0)) {
ans.push_back(nums[i]);
mx--;
}
}
reverse(ans.begin(), ans.end());
return ans;
}
};