【leetcode】368. Largest Divisible Subset


題目描述:

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 }

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM