題目描述:
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.
解題分析:
如果a%b==0,則a=mb,所以如果把數組排序后如果a%b==0,且b%c==0則a%c==0。這就為用動態規划實現提供了可能性。設置一個數組result,result[i]表示i出包含的滿足條件的子集個數。則如果nums[i]%nums[j]==0,則result[i]=result[j]+1;同時由於函數要返回的是一個List,所以我們要保存最長集合的路徑。這個功能可以通過設置一個pre數組保存能被nums[i]整除的上一個數的索引。並在保存max值的同時保存max所在的位置maxIndex即可。
1 public class Solution { 2 public static List<Integer> largestDivisibleSubset(int[] nums) { 3 4 if(nums.length==0){ 5 return new ArrayList<Integer>(); 6 } 7 if(nums.length==1){ 8 List<Integer> array = new ArrayList<Integer>(); 9 array.add(nums[0]); 10 return array; 11 } 12 Arrays.sort(nums); 13 int len = nums.length; 14 int[] result=new int[len]; 15 int[] pre=new int[len]; 16 result[0]=nums[0]; 17 pre[0]=-1; 18 int max=1; 19 int maxIndex=0; 20 for(int i=1;i<nums.length;i++){ 21 result[i]=1; 22 pre[i]=-1; 23 for(int j=0;j<i;j++){ 24 if(nums[i]%nums[j]==0){ 25 result[i]=result[j]+1; 26 pre[i]=j; 27 if(result[i]>max){ 28 max=result[i]; 29 maxIndex=i; 30 } 31 } 32 33 } 34 } 35 List<Integer> array = new LinkedList<Integer>(); 36 int index = maxIndex; 37 while(index!=-1){ 38 array.add(0,nums[index]); 39 index=pre[index]; 40 } 41 return array; 42 } 43 }