描述
给你一个由 无重复 正整数组成的集合 nums ,请你找出并返回其中最大的整除子集 answer ,子集中每一元素对 (answer[i], answer[j]) 都应当满足:
answer[i] % answer[j] == 0 ,或
answer[j] % answer[i] == 0
如果存在多个有效解子集,返回其中任何一个均可。
分析
给数组排序这样从前向后遍历,只要当前数能整除前面的某个数则说明构成一个相互求余为0的子集。
使用“最长子序列”的解法求得以当前结点为结尾的最长相互求余为0的长度。
使用另一个数组标记当前结点最长相互求余为0前一个结点。
class Solution {
public List<Integer> largestDivisibleSubset(int[] nums) {
int[] dp = new int[nums.length];
int[] pre = new int[nums.length];
Arrays.sort(nums);
dp[0] = 1;
int ans = 1;
int index = 0;
List<Integer> res = new ArrayList<>();
for(int i = 1; i < nums.length; i++){
dp[i] = 1;
for(int j = 0; j < i; j++){
if(nums[i] % nums[j] == 0 && dp[i] < dp[j] + 1){
pre[i] = j;
dp[i] = dp[j] + 1;
}
}
if(ans < dp[i]) {
index = i;
ans = dp[i];
}
}
for(int i = 0; i < ans; i++){
res.add(nums[index]);
index = pre[index];
}
return res;
}
}