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 }