给定一个包含非负数的数组和一个目标整数 k,编写一个函数来判断该数组是否含有连续的子数组,其大小至少为 2,总和为 k 的倍数,即总和为 n*k,其中 n 也是一个整数。
示例 1:
输入: [23,2,4,6,7], k = 6
输出: True
解释: [2,4] 是一个大小为 2 的子数组,并且和为 6。
示例 2:
输入: [23,2,6,4,7], k = 6
输出: True
解释: [23,2,6,4,7]是大小为 5 的子数组,并且和为 42。
说明:
"""
记录每个下标的模运算值,到下一个元素时当前元素+上一个模结果再取模保存,也就是(a)%k, ((a)%k+b)%k, (((a)%k+b)%k+c)%k, ((((a)%k+b)%k+c)%k... + n)%k
当前位置的元素计算完模之后要是结果跟前面所保存的模的值一样,就把前面下标位置之前的元素都剔除,剩下元素模结果就是0,所以剩下元素数量大于等于2时就满足了要求。
"""
hashmap = {}
sums = 0
hashmap[0] = -1 #为了第一个元素取模=0时候判断字数组大于2;if i-hashmap[sums] > 1| 0-(-1)=1
for i in range(len(nums)):
sums+=nums[i]
sums = sums%k
if sums in hashmap:
if i-hashmap[sums] > 1: # 判断之前保存的模结果下标距离是否比当前下标为>1
print(nums[hashmap[sums]+1:i+1])
else:
hashmap[sums] = i
原文:https://www.cnblogs.com/hornets/p/12887558.html