问:给你一个由 无重复 正整数组成的集合 nums ,请你找出并返回其中最大的整除子集 answer ,子集中每一元素对 (answer[i], answer[j]) 都应当满足:
answer[i] % answer[j] == 0 ,或
answer[j] % answer[i] == 0
如果存在多个有效解子集,返回其中任何一个均可。
例:
输入:nums = [1,2,3]
输出:[1,2]
解释:[1,3] 也会被视为正确答案。
原题链接:https://leetcode.cn/problems/largest-divisible-subset/
答:
class Solution {
public List<Integer> largestDivisibleSubset(int[] nums) {
int len = nums.length;
Arrays.sort(nums);//排序
int[] f1 = new int[len];//记录最大子集长度
int[] f2 = new int[len];//记录最大子集中的前一个数下标
for(int i = 0;i < len;i++)
{
//起始长度为1,单个是一个子集
int t = 1,p = i;
for(int j = 0 ;j < i;j++)
{
if(nums[i] % nums[j] == 0)//找到就接在后面
{
if(f1[j] + 1 > t)
{
t = f1[j] + 1;
p = j;
}
}
}
f1[i] = t;
f2[i] = p;
}
int max = -1,index = -1;
//找到最大长度和下标
for(int i = 0;i < len;i++)
{
if(f1[i] > max)
{
index = i;
max = f1[i];
}
}
List<Integer> list = new ArrayList<Integer>();
while(list.size() != max)
{
list.add(nums[index]);
index = f2[index];
}
Collections.sort(list);//对集合进行排序
return list;
}
}