# [368. 最大整除子集](https://leetcode.cn/problems/largest-divisible-subset)

[English Version](/solution/0300-0399/0368.Largest%20Divisible%20Subset/README_EN.md)

## 题目描述

<!-- 这里写题目描述 -->

给你一个由 <strong>无重复</strong> 正整数组成的集合 <code>nums</code> ,请你找出并返回其中最大的整除子集 <code>answer</code> ,子集中每一元素对 <code>(answer[i], answer[j])</code> 都应当满足:

<ul>
	<li><code>answer[i] % answer[j] == 0</code> ,或</li>
	<li><code>answer[j] % answer[i] == 0</code></li>
</ul>

<p>如果存在多个有效解子集,返回其中任何一个均可。</p>

<p> </p>

<p><strong>示例 1:</strong></p>

<pre>
<strong>输入:</strong>nums = [1,2,3]
<strong>输出:</strong>[1,2]
<strong>解释:</strong>[1,3] 也会被视为正确答案。
</pre>

<p><strong>示例 2:</strong></p>

<pre>
<strong>输入:</strong>nums = [1,2,4,8]
<strong>输出:</strong>[1,2,4,8]
</pre>

<p> </p>

<p><strong>提示:</strong></p>

<ul>
	<li><code>1 <= nums.length <= 1000</code></li>
	<li><code>1 <= nums[i] <= 2 * 10<sup>9</sup></code></li>
	<li><code>nums</code> 中的所有整数 <strong>互不相同</strong></li>
</ul>

## 解法

<!-- 这里可写通用的实现逻辑 -->

<!-- tabs:start -->

### **Python3**

<!-- 这里可写当前语言的特殊实现逻辑 -->

```python
class Solution:
    def largestDivisibleSubset(self, nums: List[int]) -> List[int]:
        nums.sort()
        n = len(nums)
        f, p = [0] * n, [0] * n
        for i in range(n):
            l, pre = 1, i
            for j in range(n):
                if nums[i] % nums[j] == 0 and f[j] + 1 > l:
                    l = f[j] + 1
                    pre = j
            f[i] = l
            p[i] = pre
        max_len, max_index = 0, 0
        for i, v in enumerate(f):
            if max_len < v:
                max_len = v
                max_index = i
        ans = []
        while len(ans) < max_len:
            ans.append(nums[max_index])
            max_index = p[max_index]
        return ans[::-1]
```

### **Java**

<!-- 这里可写当前语言的特殊实现逻辑 -->

```java
class Solution {
    public List<Integer> largestDivisibleSubset(int[] nums) {
        Arrays.sort(nums);
        int n = nums.length;
        int[] f = new int[n], p = new int[n];
        for (int i = 0; i < n; i++) {
            int l = 1, pre = i;
            for (int j = 0; j < i; j++) {
                if (nums[i] % nums[j] == 0 && f[j] + 1 > l) {
                    l = f[j] + 1;
                    pre = j;
                }
            }
            f[i] = l;
            p[i] = pre;
        }
        int maxLen = 0, maxIndex = 0;
        for (int i = 0; i < n; i++) {
            if (f[i] > maxLen) {
                maxLen = f[i];
                maxIndex = i;
            }
        }
        List<Integer> ans = new ArrayList<>();
        while (ans.size() < maxLen) {
            ans.add(nums[maxIndex]);
            maxIndex = p[maxIndex];
        }
        Collections.reverse(ans);
        return ans;
    }
}
```

### **...**

```

```

<!-- tabs:end -->