📅  最后修改于: 2023-12-03 14:55:34.746000             🧑  作者: Mango
给定一个长度为n的数组,你可以进行如下操作:
请判断是否可以通过若干次操作使数组中所有元素相等,如果可以返回true,否则返回false。
显然,对于一个数组,如果可以通过一系列操作使数组所有元素相等,那么这个元素一定是数组的平均数。
如果数组中有一个元素不是1,那么一定无法通过操作使数组所有元素相等,因为我们只能将元素变为1或原来的两倍,无法将大于1的元素变为小于1的元素。
如果数组中有一个元素比其他元素还要大,那么这个元素也无法通过操作变为数组的平均数,因为我们只能将元素变为1或原来的两倍,无法将元素变小。
因此,我们只需要判断数组中的最小值是否可以通过一系列操作变为数组的平均数即可。
def can_make_equal(nums):
s = sum(nums)
if s % len(nums) != 0: # 平均值不是整数,无法通过操作变为平均值
return False
avg = s // len(nums)
if avg == 1: # 平均值为1,只能将元素变为2
for num in nums:
if num % 2 != 0:
return False
return True
# 平均值不为1,判断最小值是否可以通过操作变为平均值
min_num = min(nums)
if min_num >= avg: # 最小值大于平均值,无法通过操作变为平均值
return False
diff = avg - min_num # 最小值需要增加的值
for num in nums:
if num < diff or (num - diff) % 2 != 0: # 存在元素无法通过操作变为平均值
return False
return True
将数组求和和求最小值的时间复杂度都是O(n),因此总时间复杂度为O(n)。
由于算法只使用了常数级别的临时变量,因此空间复杂度为O(1)。
assert can_make_equal([1, 2, 3, 4, 5, 6])
assert not can_make_equal([1, 2, 3, 4, 5])
assert not can_make_equal([1, 2, 3, 6])
assert not can_make_equal([3, 6, 12])
assert can_make_equal([1])
assert can_make_equal([1, 1, 1, 1])
assert not can_make_equal([7, 14])