368. Largest Divisible Subset

先把数组排序,然后每一个数的位置上最长的序列是这个数之前的位置最长序列+1。这样一遍走完就可以知道最长的序列是多少,但是除了最长序列还需要知道那个序列,所以另外一个记录由哪个位置来的。因为最后一个数字未必会构成最长序列,所以还需要找到一个最长序列的那个结尾,一个max, maxPos.

所以维持四个变量:

1. cnt[len]

2. pos[len]

3. max

4. maxPos

 1     public List<Integer> largestDivisibleSubset(int[] nums) {
 2         List<Integer> res = new ArrayList<Integer>();
 3         if(nums.length == 0) {
 4             return res;
 5         }
 6         Arrays.sort(nums);
 7         int len = nums.length;
 8         int[] cnt = new int[len];
 9         int[] pos = new int[len];
10         int max = 1;
11         int maxPos = 0;
12         for(int i = len - 1; i >= 0; i--) {
13             cnt[i] = 1;
14             for(int j = i + 1; j < len; j++) {
15                 if(nums[j] % nums[i] == 0 && cnt[i] < cnt[j] + 1) {
16                     cnt[i] = cnt[j] + 1;
17                     pos[i] = j;
18                     if(cnt[i] > max) {
19                         max = cnt[i];
20                         maxPos = i;
21                     }
22                 }
23             }
24         }
25         while(max > 0) {
26             res.add(nums[maxPos]);
27             maxPos = pos[maxPos];
28             max--;
29         }
30         return res;
31     }

 

posted @ 2016-06-28 06:33  warmland  阅读(163)  评论(0编辑  收藏  举报