LeetCode(python)——560.和为k的子数组
题目
给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的子数组的个数 。
子数组是数组中元素的连续非空序列。
示例 1:
输入:nums = [1,1,1], k = 2 输出:2
示例 2:
输入:nums = [1,2,3], k = 3 输出:2
思路
(1)前缀和——pre[i]定义为数组前i个元素的和
如果已知每个下标的前缀和,那么[i....j-1]这个子数组的和为k,则意味着pre[j] - pre[i] == k,左右变换一下可以得到:pre[i] = pre[j] - k
非常好,那么我们就可以在遍历数组计算每个下标前缀和的时候,计算target = pre[j] - k,如果已经记录的前缀和pre[i] == target,就说明对于pre[j]而言,找到了一个子数组[i....j-1]
(2)哈希表
在找前缀和pre[i]时,可以不用数组存,那么也就可以不用再遍历一遍前缀和了
用哈希表存,key = pre[i],value = pre[i]出现的次数
A tip:
数组有序——滑动窗口
数组无序——前缀和
代码
class Solution:def subarraySum(self, nums: List[int], k: int) -> int:ans = 0pre = 0mp = {0: 1} # 初始化pre[0],以备出现从头开始的子数组计算eg:pre[i]==k,那么pre[i]-k=0,要找的前缀和就是0for num in nums:pre += num # 计算前缀和target = pre - k # 计算满足条件的前缀和ans = ans + mp.get(target, 0) # 记录答案mp[pre] = mp.get(pre, 0) + 1 # 记录当前的前缀和return ans
