R5-子串篇
目录
思路:
滑动,应该可以使用滑动窗口来解题。
貌似前缀和也可以,left,right两个指针,right的前缀和-left的前缀和表示的就是从left到right数组的和。
这题之前做过,有点印象,先入为主。
要利用前缀和计算某个连续数组的值。
先使用哈希表记录每个前缀和出现的次数。
当计算到某个前缀和为s的时候,我们判断s-k这个前缀和是否存在。
如果这个前缀和是存在的,那么说明从s-k的位置到s的位置这一段连续的数组是符合题意的。
因为该数组的取值可能是负数,所有可能有多个前缀和相同的情况(这也印证了前面哈希表记录前缀和出现的次数而不是位置)。
优化:
前面提到的判断前缀和以及计算前缀和次数可以放在同一个for循环中。
tip:
#数组-1位置的前缀和0应该为1
代码:
class Solution:
def subarraySum(self, nums: List[int], k: int) -> int:
ret=0
s=0
dict=defaultdict(int)
#数组-1位置的前缀和0应该为1
dict[0]=1
for x in nums:
s+=x
ret+=dict[s-k]
dict[s]+=1
return ret
结果:
ps:
今夕是何年,我竟时差倒。