使用动态规划,这里需要注意因为返回的数字集合,所以还需要一个之前下标数组来存储dp[i]前一个数字的下标
class Solution {
public List<Integer> largestDivisibleSubset(int[] nums) {
Arrays.sort(nums);
//动态规划 dp[i] = Math.max( dp[ nums[i] % nums[j] == 0 ] ) + 1
// hashMap 存储 对应的 dp[i] 和 list
int length = nums.length;
int[] dp = new int[length];
//用一个数组来存储dp[i]在子列表中对应的上一个数的下标,如果是自己那就是i
int[] pres = new int[length];
//每一个都为1,因为自己都算
dp[0] = 1;
//遍历
for (int i = 1; i < length; i++){
int max = 0;
int pre = i;
for(int j = 0; j < i; j++){
if (nums[i] % nums[j] == 0){
if (max < dp[j]){
max = dp[j];
pre = j;
}
}
}
dp[i] = max + 1;
pres[i] = pre;
}
//遍历dp数组,找到长度最大的下标
int max = 1;
int index = 0;
for(int i = 1; i < length; i++){
if (dp[i] > max){
index = i;
max = dp[i];
}
}
//根据index找到上一个数依次加入到集合中
ArrayList<Integer> result = new ArrayList<>();
//当前index是最大的数的位置
while (index != pres[index]){
result.add(nums[index]);
index = pres[index];
}
result.add(nums[index]);
return result;
}
}