leetcode-523 连续的子数组和
解题思路
- 前缀和 超时 复杂度(\(O(n^2)\))
使用一维矩阵sum_matrix存储前缀和,\(summatrix[i]\)表示\(0-i\)元素连续的子数组和,则\(summatrix[j]-summatrix[i]\)表示\(i-j\)元素的子数组和,则条件成立时满足:\[(summatrix[j]-summatrix[i])%k==0 and j-i>1
\]
- 前缀和+map 复杂度(\(O(n)\))
对于一个数组\([a,b,c,d,e]\)\[a+b+c=k*x+rem
\]
\[a+b+c+d+e=k*y+rem
\]
\[c+d=(y-x)*k
\]
所以只需要保证前缀和数组中对k的余数相同即可,使用一个map/字典存储,结构为{余数:位置},如果当前余数在map中存在,则\((summatrix[j]-summatrix[i])%k==0\)该条件成立,只需要判断其位置距离是否大于2,如果不存在,将其加入字典中。
代码
- 前缀和
class Solution:
def checkSubarraySum(self, nums, k: int) -> bool:
length=len(nums)
sum_matrix=[0]*(length+1)
for i in range(1,length+1):
sum_matrix[i]=sum_matrix[i-1]+nums[i-1]
for i in range(length+1):
for j in range(i+1,length+1):
if (summatrix[j]-summatrix[i])%k==0 and j-i>1:
return True
return False
- 前缀和+map
class Solution:
def checkSubarraySum(self, nums, k: int) -> bool:
sum_map={}
sum_map[0]=-1
cur=0
for i in range(len(nums)):
if ((cur+nums[i])%k) in sum_map.keys():
if i-sum_map[(cur+nums[i])%k]>1:
return True
else:
sum_map[(cur+nums[i])%k]=i
cur=cur+nums[i]
return False