给出一个由无重复的正整数组成的集合,找出其中最大的整除子集,子集中任意一对 (Si,Sj) 都要满足:Si % Sj = 0 或 Sj % Si = 0。
如果有多个目标子集,返回其中任何一个均可。
示例 1:
输入: [1,2,3]
输出: [1,2] (当然, [1,3] 也正确)
示例 2:
输入: [1,2,4,8]
输出: [1,2,4,8]
思路:定义一个map存当前元素或者索引与以它为最大值能组成的整除子集之间的映射,然后我们采用求最长递增子序列的方法找寻最大整除子集即可。
class Solution {
public List<Integer> largestDivisibleSubset(int[] nums) {
int ans=0;
int[] dp=new int[nums.length];
Map<Integer,List<Integer>> map=new HashMap<>();
Arrays.parallelSort(nums);
for(int i=0;i<nums.length;i++) {
dp[i]=1;
map.put(nums[i], new ArrayList<>());
}
for(int i=0;i<nums.length;i++) {
for(int j=0;j<i;j++) {
if(nums[i]%nums[j]==0 && dp[i]<dp[j]+1) {
dp[i]=dp[j]+1;
map.get(nums[i]).clear();
map.get(nums[i]).addAll(map.get(nums[j]));
}
}
ans=Math.max(ans, dp[i]);
map.get(nums[i]).add(nums[i]);
}
for(int i=0;i<nums.length;i++)
if(ans==dp[i])
return map.get(nums[i]);
return new ArrayList<>();
}
}