问题描述
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.
Example 1:
nums: [1,2,3]
Result: [1,2] (of course, [1,3] will also be ok)
Example 2:
nums: [1,2,4,8]
Result: [1,2,4,8]
代码实现
public class LargestDivisibleSubset {
public static List<Integer> largestDivisibleSubset(int[] nums) {
int[] dp = new int[nums.length];
int[] pre = new int[nums.length];
Arrays.sort(nums);
for(int i = 0; i < nums.length; i++){
int max = 0;
int maxIndex = -1;
for(int j = i - 1; j >=0; j--){
if(nums[i] % nums[j] == 0){
if(dp[j] + 1 > max){
max = dp[j] + 1;
maxIndex = j;
}
}
}
if(maxIndex == -1){
dp[i] = 0;
pre[i] = -1;
}
else{
dp[i] = max;
pre[i] = maxIndex;
}
}
int totalMax = 0;
for(int num : dp){
if(num > totalMax){
totalMax = num;
}
}
List<Integer> list = new LinkedList<Integer>();
for(int i = 0; i < dp.length; i++){//这里可以优化,之前的for循环中记下max的index,这里就不用遍历找了
if(dp[i] == totalMax){
int index = i;
while(index != -1){
list.add(nums[index]);
index = pre[index];
}
break;
}
}
return list;
}
public static void main(String[] args){
System.out.println(largestDivisibleSubset(new int[]{1,2,3}));
}
}