lc-368


给你一个由 无重复 正整数组成的集合 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]

提示:

  • 1 <= nums.length <= 1000
  • 1 <= nums[i] <= 2 * 109
  • nums 中的所有整数 互不相同

//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
    public List<Integer> largestDivisibleSubset(int[] nums) {
        Arrays.sort(nums);

        List<List<Integer>> dp = new ArrayList<>();
        List<Integer> first = new ArrayList<>();
        first.add(nums[0]);
        dp.add(first);

        for (int i = 1; i < nums.length; i++) {
            int maxIndex = -1;

            for (int j = 0; j < i; j++) {
                if (nums[i] % nums[j] == 0 && (maxIndex == -1 || dp.get(j).size() > dp.get(maxIndex).size())) {
                    maxIndex = j;
                }
            }

            List<Integer> curList = new ArrayList<>();
            if (maxIndex == -1) {
                curList.add(nums[i]);
            } else {
                curList.addAll(dp.get(maxIndex));
                curList.add(nums[i]);
            }
            dp.add(curList);
        }

        int maxIndex = 0;

        for (int i = 1; i < nums.length; i++) {
            if (dp.get(i).size() > dp.get(maxIndex).size()) {
                maxIndex = i;
            }
        }

        return dp.get(maxIndex);
    }
}
//leetcode submit region end(Prohibit modification and deletion)

文章作者: 倪春恩
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 倪春恩 !