📅  最后修改于: 2023-12-03 14:49:16.312000             🧑  作者: Mango
给定一个整数数组 nums
和一个正整数 K
,你需要仅通过插入元素来使所有长度为 K
的子数组的总和相等。返回你需要插入的最小元素数目,如果无法满足条件,则返回 -1
。
输入如下:
nums = [1,2,3,4], K = 3
输出如下:
2
解释:
我们可以在 nums
中插入两个元素 2
和 4
,将数组变为:[1,2,3,2,4,4]
,这样所有长度为 3
的子数组的和均为 7
。
首先,需要判断能否通过插入元素使所有长度为 K
的子数组的总和相等,即需要保证 nums
数组长度能够被 K
整除。如果无法满足条件,则直接返回 -1
。
接着,可以求出所有长度为 K
的子数组的和以及每个子数组的起始和结束下标。可以使用一个哈希表来记录每个和出现的次数。然后,通过计算哈希表中出现次数最多的和的个数,就可以得出需要插入的最小元素数目。
class Solution:
def minOperations(self, nums: List[int], K: int) -> int:
if len(nums) % K != 0:
return -1
n = len(nums)
s = [0] * (n + 1)
for i in range(1, n + 1):
s[i] = s[i - 1] + nums[i - 1]
d = {0: 1}
res = 0
for i in range(K - 1, n):
t = s[i + 1] - s[i + 1 - K]
if t not in d:
d[t] = 0
d[t] += 1
if i - K + 1 < 0:
continue
p = s[i + 1 - K] - s[i + 1 - K // 2]
if p in d:
res += d[p]
if p - s[i + 1 - K] not in d:
continue
res += d[p - s[i + 1 - K]]
return K * (n // K) - res
时间复杂度:$O(n)$
空间复杂度:$O(n)$