📅  最后修改于: 2023-12-03 14:55:18.689000             🧑  作者: Mango
给定一个长度为 n
的数组 nums
,你需要最大化地对它执行若干次以下操作之一:
1
,或1
使数组中的所有元素都相等,返回操作的最大次数。
我们可以首先找到数组中的中位数 m
,然后分别计算每个元素 nums[i]
和 m
的差值的绝对值,最后求和即可。
那么如何找到中位数呢?我们可以先将数组排序,然后取中间的那一个或两个数的均值。
然后我们可以遍历一遍数组,计算每个元素和中位数的差值的绝对值,并累加到一个变量 ans
中,最后返回 ans
即可。
但是上述方法的时间复杂度为O(nlogn),接下来介绍一种时间复杂度为O(n)的解法。
我们首先先找到数组中的最小值 min
和最大值 max
,然后可以发现,如果数组中所有元素都相等,那么它们的和一定是 n * avg
,其中 avg
是所有元素的平均数。
那么我们可以首先算出数组元素的和 sum
,然后分别计算 min
和 max
和 avg
之间的差值,然后取两者之间的最大值,即 res = max(abs(avg - min), abs(avg - max))
。
最后我们只需要在 res
个元素中切换即可,操作次数即为 res
。
def minMoves(self, nums: List[int]) -> int:
n = len(nums)
if n == 1:
return 0
min_val, max_val = min(nums), max(nums)
avg = sum(nums) // n
res = max(abs(avg - min_val), abs(avg - max_val))
return res