📅  最后修改于: 2023-12-03 15:27:54.354000             🧑  作者: Mango
给定一个整数数组,需要向其中插入一个整数,使得插入后数组中所有的数的总和相等。需要返回插入的最小整数值。
假设数组的总和为 sum
,则插入的整数值为 target
。插入 target
后数组的总和为 sum + target
。如果 sum + target
不是偶数,则无法插入,直接返回-1。
在插入 target
后,数组中每个元素都要参与计算,因此需要求出每个元素的贡献值 diff
,即从 target
中取出一些数使得这个元素的值加上 diff
刚好等于 sum + target
的一半。如果 sum + target
的一半小于数组的最大值,则只需要将 target
设为最大值加上 1
,即可使数组的总和变为偶数。
def minInsertion(nums: List[int]) -> int:
sum_nums = sum(nums)
if (sum_nums + 1) % 2:
return -1
target = max(nums) + 1
while True:
half = (sum_nums + target) // 2
diff = half - sum_nums
if diff < 0 or diff > target:
target += 1
else:
return diff
本算法时间复杂度为 $O(n^2)$,空间复杂度为 $O(1)$。其中的循环是通过不断增加 target
来实现的,当 target
足够大时,程序必然会终止。因此本算法的时间复杂度上界为 $\sum_{i=1}^{+\infty}{i} = O(i^2)$,空间复杂度为常数级别,因此是非常高效的。