368. 最大整除子集
因此,我们的结论是,我们每次只需要加入
a
[
n
]
%
a
[
n
−
1
]
=
=
0
a[n]\%a[n-1]==0
a[n]%a[n−1]==0的元素到list中即可。
但是要注意下面的例子
- [9,18,54,108,540]
- [9,18,90,180,360,720]。
- 即每一个元素的前半部分可能是公用的,如[9,18]。
class Solution {
public List<Integer> largestDivisibleSubset(int[] nums) {
Arrays.sort(nums);
int n = nums.length;
int[] f = new int[n]; // f[i]为nums[0,i]中包含nums[i]的最大整除子集的元素个数
int[] g = new int[n]; // g[i]记录了当前nums[i]前一个元素是多少,第一个元素的g默认为自身
for(int i=0;i<n;i++){
int len=1; // 默认有自己这个元素
int prev=i;
for(int j=0;j<i;j++){
if(nums[i]%nums[j]==0){
// 并且接在它后面能更长,我们就更新 🌟
if (f[j] + 1 > len) {
len += 1;
prev = j;
}
}
}
f[i] = len;
g[i] = prev;
}
// 找到最长的整除子集
int max = -1;
int index = -1;
for(int i=0;i<n;i++){
if(max<f[i]){
max = f[i];
index = i;
}
}
// 倒序构建解答
List<Integer> res = new ArrayList<>();
while(res.size()!=max){
res.add(nums[index]);
index = g[index];
}
return res;
}
}