📅  最后修改于: 2023-12-03 15:10:54.544000             🧑  作者: Mango
给定一个由整数组成的圆形数组,你需要检查是否存在一种方法可以通过增加相邻的两个元素使得整个数组的所有元素相等。
具体地,每次操作可以从数组中选取一个下标 i
,并使用下标相邻的两个元素 x
和 y
(x
不等于 y
,且 i
等于 x
或 y
的下标),将它们加上整数 1
。
你可以执行此操作任意次数。请你找出并返回使所有数组元素相等的最少操作次数。如果无法使所有数组元素相等,则返回 -1
。
为了让圆形数组的元素相等,首先必须让数组所有元素的总和能够被数组长度整除。如果不能被整除,则无法通过操作使得所有元素相等,直接返回 -1
即可。
如果数组可以被整除,则可以通过以下步骤来实现目标:
avg
,即数组元素总和除以数组长度。diff
,如果差值不是偶数,则无法通过操作使得所有元素相等,直接返回 -1
即可。count
,即所有 diff
为正数的元素的差值之和。因为每次操作可以让相邻的两个元素都加上 1
,所以 diff
为正数的元素必须通过操作变为 avg
,因为 avg
一定比元素本身大,所以只能通过让相邻的两个元素都加上 1
来实现。count
即可。def min_moves_to_make_all_equal(nums: List[int]) -> int:
n = len(nums)
total_sum = sum(nums)
if total_sum % n != 0:
return -1
avg = total_sum // n
count = 0
for i in range(n):
diff = nums[i] - avg
if diff % 2 != 0:
return -1
elif diff > 0:
count += diff // 2
return count
本问题的关键在于判断是否能通过操作使所有元素相等,只有数组元素之和能够被数组长度整除,且每个元素与平均值的差值都是偶数时,才有可能通过操作使所有元素相等。具体实现时,可以先计算平均值,然后遍历数组,统计需要进行操作的次数即可。