给出一个由无重复的正整数组成的集合,找出其中最大的整除子集,子集中任意一对 (Si,Sj) 都要满足:Si % Sj = 0 或 Sj % Si = 0。
如果有多个目标子集,返回其中任何一个均可。
示例 1:
输入: [1,2,3]
输出: [1,2] (当然, [1,3] 也正确)
示例 2:
输入: [1,2,4,8]
输出: [1,2,4,8]
1,先排序
2,后从小到大逐渐动态规划找出最长路径的上一个数的下标来源
3,然后回溯路径得到最终解
class Solution { public List<Integer> largestDivisibleSubset(int[] nums) { List<Integer> ans=new ArrayList<>(); if (nums.length==0){ return ans; } //dp负责计算集合元素个数 dp2负责保存上一个数的下标 int[] dp=new int[nums.length]; int[] dp2=new int[nums.length]; Arrays.fill(dp,1); Arrays.fill(dp2,-1); Arrays.sort(nums); for (int i=1;i<nums.length;i++){ for (int j=0;j<i;j++){ if (nums[i]%nums[j]==0){ if (dp[i]<dp[j]+1){ dp[i]=dp[j]+1; dp2[i]=j; } } } } int index=0; //找到最大的整数子集 for (int i=1;i<nums.length;i++){ if (dp[i]>dp[index]){ index=i; } } while (index!=-1){ ans.add(nums[index]); index=dp2[index]; } return ans; } }
原文:https://www.cnblogs.com/yanhowever/p/11842974.html