📅  最后修改于: 2023-12-03 15:12:50.832000             🧑  作者: Mango
给定一个长度为n的整数数组nums,你可以对其中的某一个数进行一次改变,将其变为任意一个数。
请你找出需要改变这个数的最小位数,并输出这个最小位数。
由于只能改变一个数,那么我们可以依次枚举原数组中每个数,假设当前枚举的是nums[i],我们可以将其将其变为某个数x,使得所有数都相等。
假设当前总和为sum,则我们有:sum - nums[i] + x = n * x。
化简一下就可以得到:
x = (sum - nums[i]) / n + 1
这里需要进行向下取整操作,若x大于原数组中最大的数,则说明无法满足条件,返回-1即可。
def min_moves(nums: List[int]) -> int:
n = len(nums)
sum_val = sum(nums)
max_val = max(nums)
x = (sum_val - nums[0]) // n + 1
if x > max_val:
return -1
res = abs(x - nums[0])
for i in range(1, n):
x = (sum_val - nums[i]) // n + 1
if x > max_val:
return -1
res = min(res, abs(x - nums[i]))
return res
本算法只进行了一次遍历,时间复杂度为O(n)。