题目链接
对于一个子集来讲
如果一个数大于这个子集中最大的数且能整除这个最大的数,那么这个数一定能整除这个子集中的所有数
如果一个数小于这个子集中最小的数且子集中最小的数能整除这个数,那么这个数一定可以被子集中所有数整除
由上面两种思路可以得到解法
我们先对数组排序,按照从小到大的顺序排列,然后对于
dp[i]以i结尾最长的子序列的长度public List largestDivisibleSubset(int[] nums) {
LinkedList P=new LinkedList();
if(nums.length==0){
return P;
}
int[] dp=new int[101010];
int[] check=new int[101101];
Arrays.fill(dp, -1);
Arrays.sort(nums);
Arrays.fill(check, -1);
int maxvalue=-99;
int maxindex=0;
for(int i=0;i
for(int j=0;j
if(nums[i]%nums[j]==0){
if(dp[i]
dp[i]=dp[j]+1;
check[i]=j;
}
}
}
if(dp[i]>maxvalue){
maxindex=i;
maxvalue=dp[i];
}
}
int index=maxindex;
while(index!=-1){
P.add(nums[index]);
index=check[index];
}
Collections.sort(P);
return P;
}