这就到前缀和了。
class Solution:
def subarraySum(self, nums: List[int], k: int) -> int:
#连续不能sort
num=len(nums)
i=0
j=i+1
sm=0
ret=0
#j可以=是因为后面切片不包括j
while j<=num:
sm=sum(nums[i:j])
if sm>k:
if (j+1)<num and nums[j+1]<0:
j+=1
else:
i+=1
j=i+1
elif sm<k:
j+=1
else:
if (j+1)<num and nums[j+1]>0:
j+=1
else:
ret+=1
i+=1
j=i+1
return ret
想太复杂了,事实上,这题不能使用滑动窗口来做,因为不满足单调性,就是可能是负数。
两次遍历
class Solution:
def subarraySum(self, nums: List[int], k: int) -> int:
num=len(nums)
s=[0]*(num+1)
for i,x in enumerate(nums):
s[i+1]=s[i]+x
ret=0
cnt=defaultdict(int)
for j in s:
ret+=cnt[j-k]
cnt[j]+=1
return ret
一次遍历
class Solution:
def subarraySum(self, nums: List[int], k: int) -> int:
#一边计算前缀和,一边遍历前缀和
ret=s=0
cnt=defaultdict(int)
cnt[0]=1
for x in nums:
s+=x
ret+=cnt[s-k]
cnt[s]+=1
return ret
ps:
灵神题解
标签:cnt,nums,python,self,ret,int,num,数组,刷题 From: https://blog.csdn.net/m0_73629042/article/details/140682164