前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >368. 最大整除子集

368. 最大整除子集

作者头像
CaesarChang张旭
发布2021-06-29 10:16:24
8200
发布2021-06-29 10:16:24
举报
文章被收录于专栏:悟道

给你一个由 无重复 正整数组成的集合 nums ,请你找出并返回其中最大的整除子集 answer ,子集中每一元素对 (answer[i], answer[j]) 都应当满足: answer[i] % answer[j] == 0 ,或 answer[j] % answer[i] == 0 如果存在多个有效解子集,返回其中任何一个均可。 示例 1: 输入:nums = [1,2,3] 输出:[1,2] 解释:[1,3] 也会被视为正确答案。 示例 2: 输入:nums = [1,2,4,8] 输出:[1,2,4,8]

代码语言:javascript
复制
class Solution {
    public List<Integer> largestDivisibleSubset(int[] nums) {
  //排序
  Arrays.sort(nums);

  //记录当前点的来源
  int [] g=new int[nums.length+1];
  //记录每一点的最大值
  int [] dp=new int[nums.length+1];
  //i代表当前元素
  for(int i=0;i<nums.length;i++){
      int len=1,prev=i;//代表最小长度是1,有自身转移而来

      //j代表i之前的所有元素
      for(int j=0;j<i;j++){
          //如果能够整除
          if(nums[i]%nums[j]==0){
              //判断当前j最大值+1是否大于我们假设的最大值
              if(dp[j]+1>len){
              len=dp[j]+1;
              prev=j;
          }
          }
      }
      g[i]=prev;
      dp[i]=len;
  }

    //遍历所有dp[i] 来获取最大值是多少以及他的下标
    int max=-Integer.MAX_VALUE;
    int index=-Integer.MAX_VALUE;

    for(int i=0;i<nums.length;i++){
        if(dp[i]>max){
            max=dp[i];
            index=i;
        }
    }
        //得到最大值以及他的下标,进行从后往前插入到集合里面

        List<Integer> ans=new ArrayList();
        while(ans.size()<max){
            ans.add(nums[index]);
            index=g[index];
        }

        Collections.sort(ans,(o1,o2)-> o1-o2);
            return ans;

    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/06/24 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档