📅  最后修改于: 2023-12-03 15:11:55.608000             🧑  作者: Mango
给定一个整数数组,计算要删除的最小子数组的长度,以使数组中其余元素的总和被 K 整除。如果无法使其余元素的总和被 K 整除,则返回 -1。
输入: [5, 6, 8, 9], K = 6
输出: 2
解释: 可以删去 [9, 5],剩余的数组为 [6, 8],它们的和为 14,可以被 6 整除。
输入: [4, 5, 7, 8], K = 3
输出: -1
解释: 无法通过删除任何子数组使得其余元素相加的和能够被 3 整除。
def min_subarray(nums: List[int], K: int) -> int:
mod_dict = {0: -1} # 如果前缀和除以K为0,说明当前这一段子数组符合要求
prefix_sum = 0
min_len = float('inf')
for i, num in enumerate(nums):
prefix_sum += num
mod = prefix_sum % K
if mod in mod_dict:
# 如果前面已经出现了相同的模数,则计算子数组的长度
min_len = min(min_len, i - mod_dict[mod])
mod_dict.setdefault(mod, i)
return min_len if min_len != float('inf') else -1
本题使用前缀和和哈希表来解决,时间复杂度为O(n)。