LeetCode368

最大整除子集》》》
在这里插入图片描述

对数组进行排序,状态转移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;

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值