标签(空格分隔): leetcode
1. 原题
Given a set of distinct positive integers, find the largest subset such that every pair (Si, Sj) of elements in this subset satisfies: Si % Sj = 0 or Sj % Si = 0.
If there are multiple solutions, return any subset is fine.
2. 分析
- 题目要求在一个正数数列中, 找到一个子数列,使得子数列中的 Si % Sj = 0 or Sj % Si = 0.换个角度想,这种子数列如果排好序,也就是子数列中的后面的数都能整除前面的数。
- 使用
dp[i]
保存以
i
结尾的满足条件的子数列, 以
0<=j<i 中的数一一和 nums[i] 检验,如果 nums[i] 满足 dp[j] , 那么 nums[i] 就加在最长的 dp[j] 上面
dp[x]=max(dp[x],dp[y]+1)0<=y<x,nums[x]%nums[y]==0 - 考虑空数组的特殊情况,使用vector 保存 dp[i]
3. 代码
class Solution {
public:
vector<int> largestDivisibleSubset(vector<int>& nums) {
int size = nums.size();
if (size == 0)
return vector<int>();
sort(nums.begin(), nums.end());
vector<vector<int> > ans(size);
ans[0] = vector<int>{ nums[0] };
for (int i = 1; i < size; i++) {
vector<int> v;
v.push_back(nums[i]);
ans[i] = v;
for (int j = i - 1; j >= 0; j--) {
if (nums[i] % nums[j] == 0 || nums[j] % nums[i] == 0) {
v = ans[j];
v.push_back(nums[i]);
if (v.size() > ans[i].size()) {
ans[i] = v;
}
}
}
}
int max = 0;
int maxIndex = 0;
for (int i = 0; i < ans.size(); i++) {
if (ans[i].size() > max) {
max = ans[i].size();
maxIndex = i;
}
}
vector<int> v;
for (int i = 0; i < ans[maxIndex].size(); i++) {
v.push_back(ans[maxIndex][i]);
}
return v;
}
};
195

被折叠的 条评论
为什么被折叠?



