📅  最后修改于: 2023-12-03 15:40:24.435000             🧑  作者: Mango
在一个给定的非空正整数数组中,找出能够被数组中其他元素整除的最大值子集,输出其中任意一个子集即可。
例如,给定数组 [1, 2, 3, 4, 6]
,输出一个满足条件的子集 [1, 2, 4, 6]
。
min_val
。因为我们只需要找到最大的除数子集,因此最小值不可能成为除数,我们可以从 min_val
开始枚举除数。dp
,用于保存每个元素的最大除数子集。在开始之前,所有元素都不属于任何子集,因此所有 dp
数组中的元素都为 1
。min_val
开始枚举除数 i
,对于每个除数,遍历数组中的所有元素 j
,如果 j
能够整除 i
,则将 dp[j]
更新为 max(dp[j], dp[i] + 1)
。dp
数组中的最大值即为所求的最大除数子集的长度,我们可以倒推出这个子集。def largest_divisible_subset(nums: List[int]) -> List[int]:
n = len(nums)
if n == 0:
return []
nums.sort()
min_val = nums[0]
dp = [1] * n
for i in range(min_val, nums[-1] + 1):
for j in range(n):
if nums[j] % i == 0:
dp[j] = max(dp[j], dp[i - min_val] + 1)
max_val = max(dp)
idx = dp.index(max_val)
ans = [nums[idx]]
for i in range(idx - 1, -1, -1):
if ans[-1] % nums[i] == 0 and dp[i] == max_val - len(ans) + 1:
ans.append(nums[i])
return ans[::-1]