该题解采用了拓扑排序的思想。首先将数组按照升序排序,然后遍历排序后的数组,对于每个元素,找到满足整除条件的前驱元素,并将当前元素添加到相应的拓扑层级中。同时,使用一个字典 route 记录每个元素的前驱元素。最后,从拓扑层级的最后一层开始,通过 route 字典回溯得到最大整除子集。
时间复杂度: O(n^2)
空间复杂度: O(n^2)
class Solution:
def largestDivisibleSubset(self, nums: List[int]) -> List[int]:
# 使用字典 topo 存储拓扑层级,字典 route 记录每个元素的前驱元素
topo, route = defaultdict(list), {}
# 将数组按照升序排序
for n in sorted(nums):
i = len(topo)
while (i := i - 1) >= 0:
# 遍历已处理的元素,找到满足整除条件的前驱元素
for m in topo[i]:
if n % m == 0:
topo[i + 1].append(n)
route[n], i = m, 0
break
# 如果当前元素没有找到前驱元素,将其添加到拓扑层级的第 0 层
if n not in route:
topo[0].append(n)
route[n] = None
# 从拓扑层级的最后一层开始回溯,得到最大整除子集
ret, n = [], topo[len(topo) - 1][0]
while n:
ret.append(n)
n = route[n]
return ret