📅  最后修改于: 2023-12-03 15:09:50.749000             🧑  作者: Mango
给定一个整数数组 nums 和一个整数 K,可以多次执行以下操作:选择一个索引 i,交换 nums[i] 与 nums[i+K]。元素及其索引除以 K 后,最小化交换使得所有余数相等。
我们可以使用哈希映射来统计每个余数出现的次数,然后找到最多的余数,以此为目标余数。接着,对于每个元素,将其与距离最近且余数为目标余数的位置进行交换。
def makeEqual(nums, K):
n = len(nums)
count = {}
for i in range(n):
r = nums[i] % K
if r in count:
count[r].append(i)
else:
count[r] = [i]
target_r = max(count.keys(), key=lambda x : len(count[x]))
ans = 0
for r in count.keys():
if r == target_r:
continue
while count[r]:
i = count[r].pop()
j = None
for jj in range(j, n, K):
if nums[jj] % K == target_r and jj not in count[target_r]:
j = jj
break
if j is None:
return -1
count[target_r].append(i)
ans += 1
return ans
此算法的时间复杂度为 O(NK),其中 N 是数组长度,K 是模数。空间复杂度为 O(N)。
以下是一个示例:
>>> makeEqual([1,2,3,4,5,6], 2)
3
>>> makeEqual([1,2,3,4,5,6], 3)
-1