📅  最后修改于: 2023-12-03 14:54:59.090000             🧑  作者: Mango
LCM(最小公倍数)是两个或多个整数的公共倍数中最小的一个。本题的目标是在数组中找到不重复的元素,然后计算这些元素的最小公倍数(LCM)。
给定一个整数数组 nums
,其中可能包含重复元素。请你计算数组中不重复的元素的 LCM,并返回它。
先对数组进行去重,然后计算这些不重复的元素的 LCM。在计算 LCM 之前,需要先求出这些元素的最大公因数(GCD),最大公因数可以通过辗转相除法或者更高效的欧几里得算法求得。
计算最大公因数的代码(以辗转相除法为例):
def gcd(a, b):
if b == 0:
return a
return gcd(b, a % b)
计算 LCM 的代码:
def lcm(a, b):
return a * b // gcd(a, b)
def find_lcm(nums):
unique_nums = set(nums)
res = 1
for num in unique_nums:
res = lcm(res, num)
return res
对数组进行去重需要遍历整个数组,时间复杂度为 O(n)。计算 LCM 的过程需要计算每个元素的 GCD,每个元素的 GCD 的时间复杂度为 O(log (min(a,b))),其中 a 和 b 是两个输入整数。最坏情况下,所有元素都相等,需要计算 n 次 GCD。因此,总时间复杂度为 O(n log m),其中 m 是数组中不同的整数的数量。由于需要用一个 set 存储不同的整数,因此空间复杂度为 O(m)。
输入:[6, 8, 14, 16]
输出:112
解释:数组 [6, 8, 14, 16] 中有 3 个不同的元素(6、8 和 14),它们的 LCM 是 112。
本题要求的是数组中不重复元素的 LCM。需要先对数组进行去重然后计算 LCM,计算 LCM 的过程需要先计算最大公因数。时间复杂度为 O(n log m),空间复杂度为 O(m)。