和第974题一样,求数组的一个区间是否能被k整除,由于不能统计个数,所以不用字典,哈希表就行。
- 我们要判断的是(sum[j]−sum[i])%K是否等于 0。
- 根据 mod运算的性质,我们知道 (sum[j]−sum[i])%K=sum[j]%K−sum[i]%K=0。
- 所以对于i的前面如果有sum[j]%K = sum[i]%K说明符合条件
- 题目要求区间长度大于2,这里可以延迟pre进入set的时间来完成
- 注意我们在初始时必须加上0,因为如果是nums=[i],k=9,它自身算一个。这种对后面所有能整除K的nums[i]都要算上它自身
def checkSubarraySum(self, nums, k):
"""
:type nums: List[int]
:type k: int
:rtype: bool
"""
pre = 0
mp = set()
for num in nums:
last = pre
pre += num
pre %= k
if pre % k in mp:
return True
mp.add(last)
return False
写个延迟K位的,和上述思路一致,就是要延迟k位将pre%k加入哈希表,因为有的题目要求区间的最小长度
下面是延迟一位的,k位就是i-k。
def checkSubarraySum(self, nums, k):
"""
:type nums: List[int]
:type k: int
:rtype: bool
"""
mp = set()
pre = [0]
for i in nums:
pre.append(pre[-1]+i)
for i in range(len(nums)+1):
pre[i] %= k
if pre[i] in mp:
return True
if i >= 1:
mp.add(pre[i-1])
return False