LeetCode_368 最大整除子集 (动态规划)

题目来源: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;

    }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值