对数组进行排序,状态转移
dp[i】
前i个元素的整除的最长长度;
状态转移方程
:dp[i] = Math.max(dp[i], dp[j] + 1) if(nums[i]%nums[j]==0)
记录最长的dp[i]以及其对应的index位置,之后遍历数组进行存取
public List<Integer> largestDivisibleSubset1(int[] nums) {
List<Integer> list = new ArrayList<>();
if(nums.length==0)return list;
if(nums.length==1) {
list.add(nums[0]);
return list; }
//对数组进行排序
Arrays.sort(nums);
//
int[] dp = new int[nums.length];
//dp为1
Arrays.fill(dp,1);
int max = 1, index = 0;
//确定每个dp[i]
for(int i = 1; i<nums.length;i++)
{
for (int j = i - 1; j >= 0; j--) {
//确定最长的dp[i],如果当前的值是dp[j]对应的值的最后一个值 则必然也是dp[j]的所有倍数
if (nums[i] % nums[j] == 0) dp[i] = Math.max(dp[i], dp[j] + 1);
}
//在遍历的过程中确定最大长度
if (dp[i] > max) {
max = dp[i];
//最长的索引对应的位置(最大长度)
index = i;
}
}
//遍历最大的值将结果保存到list中并将结果放回
int[] res = new int[max];
//
int temp = nums[index];
for(int i = index;i>=0;i--)
{
if (temp % nums[i] == 0 && dp[i] == max) {
res[max - 1] = nums[i];
max--;
}
}
for(int i:res)list.add(i);
return list;
}