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]
Credits:
Special thanks to @Stomach_ache for adding this problem and creating all test cases.
题意:
给出一个数组,求这样一个集合,使得该集合里任意两个数之间一个可以被另一个整除。
思路:
首先排序是必须的。排好之后,类似于最长递增子序列。用一个数组dp[i]表示从第0到第i这些数最多可以选出dp[i]个数满足条件,那么如果nums[i]%nums[j]==0,则dp[i]=max(dp[i],dp[j]+1)。再用一个数组pat[i]表示它前面一个数的位置。最后再把这些位置的数加进去。
代码:
class Solution {
public List<Integer> largestDivisibleSubset(int[] nums) {
if(nums.length==0)
return new ArrayList<>();
Arrays.sort(nums);
List<Integer>list=new ArrayList<Integer>();
int []dp=new int[nums.length];
int []pat=new int[nums.length];
for(int i=0;i<nums.length;i++)
{
dp[i]=1;
pat[i]=i;
}
int maxn=1,k=0;
for(int i=1;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;
pat[i]=j;
}
if(dp[i]>maxn)
{
maxn=dp[i];
k=i;
}
}
}
while(pat[k]!=k)
{
list.add(nums[k]);
k=pat[k];
}
list.add(nums[k]);
return list;
}
}