📅  最后修改于: 2023-12-03 14:58:31.183000             🧑  作者: Mango
给定一个由非负整数组成的数组a。定义一个正数k,使得数组中每个元素a[i]都能够整除k。你的任务是找到k的最小值。如果这样的k不存在,则返回-1。
def find_k(a: List[int]) -> int:
pass
输入:
4
4 8 16 32
输出:
4
输入:
4
4 8 16 33
输出:
-1
要求k能够整除数组中的每个元素,即数组中的每个元素都是k的倍数。因此,我们只需要求出数组中所有元素的最大公约数,即gcd。如果gcd是数组中任意两个元素的公约数,那么k就等于gcd;否则,k不存在。
注意,因为第一个元素a[0]可能为0,所以在求gcd时,需要先将数组去掉0元素再求。
from typing import List
from math import gcd
def find_k(a: List[int]) -> int:
# 去掉0元素
a = [x for x in a if x != 0]
# 如果去掉0后数组为空,则返回-1
if not a:
return -1
# 求出所有元素的最大公约数
g = a[0]
for x in a:
g = gcd(g, x)
# 如果gcd是数组任意两个元素的公约数,则k等于gcd;否则,k不存在
for x in a:
if x % g != 0:
return -1
return g
假设数组a的长度为n。