📅  最后修改于: 2023-12-03 15:42:25.891000             🧑  作者: Mango
素数(prime number)又称质数,是指在大于1的自然数中,除了1和它本身以外,无法被其他自然数整除的数。
例如:2、3、5、7、11、13、17、19...
给定一个整数数组,找到需要减去的最小素数以使得所有数组元素相等。
我们可以先统计这个数组中所有数的差值,例如:
arr = [1, 3, 5, 7]
差值数组 = [2, 2, 2]
可以发现,差值数组元素相同,那么我们需要把这个数组的元素减去一个素数,使得元素相等,这就相当于把这个数组中所有元素减去一个固定值,最终使得所有元素相等。
所以,我们可以用差值数组中的元素作为候选素数,从小到大遍历这些素数,每次用候选素数去减去数组中的每一个元素,判断新的数组是否都相等,如果是,那么就找到了需要减去的最小素数。
如果遍历完差值数组中的所有元素都没有找到,则说明原数组中所有的元素已经相等,不需要进行任何操作。
def is_prime(num):
if num < 2:
return False
for i in range(2, int(num ** 0.5) + 1):
if num % i == 0:
return False
return True
def min_prime_dif(arr):
n = len(arr)
dif_arr = []
for i in range(1, n):
dif_arr.append(arr[i] - arr[i-1])
for p in dif_arr:
if is_prime(p):
new_arr = [arr[0] - i*p for i in range(n)]
if len(set(new_arr)) == 1:
return p
return 0
本算法的时间复杂度为 $O(n\sqrt{max(arr)})$,空间复杂度为 $O(n)$。其中,$max(arr)$ 代表数组中的最大值。