给你一个由 无重复 正整数组成的集合 nums ,请你找出并返回其中最大的整除子集 answer ,子集中每一元素对 (answer[i], answer[j]) 都应当满足:
answer[i] % answer[j] == 0 ,或
answer[j] % answer[i] == 0
如果存在多个有效解子集,返回其中任何一个均可。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/largest-divisible-subset
思路:先把数组排序,用dp[]记录数组中的元素能被几个元素整除,从左向右依次计算dp[i];定义List放整除子集,
找到dp[]中的最大值dp[i],把nums[i]放入list,从i开始向前找,找到dp[j] = dp[i] - 1,且nums[i] % nums[j] = 0,
把nums[j]放到list里,继续这个过程,直到dp[j] = 0.
public List<Integer> largestDivisibleSubset(int[] nums) {
int[] dp = new int[nums.length];
int temp = 0;
int max = 0;
int m = 0;
List<Integer> list = new ArrayList<>();
Arrays.sort(nums);
for (int i = 0; i < nums.length; i++){
dp[i] = 1;
for (int j = 0; j < i; j++){
if (nums[i] % nums[j] == 0){
temp = dp[j] + 1;
if (temp > dp[i]){
dp[i] = temp;
}
}
}
if (dp[i] > max){
max = dp[i];
m = nums[i];
}
}
for (int i = nums.length - 1; i >= 0 && max > 0; i--){
if (dp[i] == max && m % nums[i] == 0){
list.add(nums[i]);
m = nums[i];
max--;
}
}
return list;
}