题目来源:LeetCode_368 最大整除子集
这题一开始没做出来,但是想到应该是用动态规划来做,稍微看了一下答案后做出来了。
令数组f[i]记录nums数组前i个数组成的集合的最大整除子集
如何计算f[i]:
1、首先将nums数组排序,从小到大排序,这样子如果j>i,只要考虑nums[j] % nums[i] == 0就可以了
2、计算f[i]时,遍历nums的前i个,看是否存在nums[i] % nums[j] == 0的情况 若存在找个变量max记录下来 max = f[j]+1 ,若都不存在则f[i]=1;
3、因为要输出子集所以这里要引入数组g[i]代表第i个数是从前面哪个数翻倍得到的
public List<Integer> largestDivisibleSubset(int[] nums) {
Arrays.sort(nums);
int len = nums.length;
List<Integer> list = new ArrayList<>();
int[] f = new int[len];
int[] g = new int[len];
f[0] = 1;
int ans = 0,index = 0;
for(int i=0; i<len; i++){
int max = 1;
for(int j=0; j<i; j++){
if(nums[i] % nums[j] == 0){
if(max < f[j]+1){
max = f[j] +1;
g[i] = j;
}
}
}
f[i] = max;
if(max == 1){
g[i] = i;
}
if(ans < max){
ans = max;
index = i;
}
}
while(list.size() != ans){ //回溯子集
list.add(nums[index]);
index = g[index];
}
return list;
}