题目描述:
给你一个整数数组 nums
和一个整数 k
,请你统计并返回 该数组中和为 k
的子数组的个数 。
子数组是数组中元素的连续非空序列。
示例 1:
输入:nums = [1,1,1], k = 2 输出:2
class Solution {
public:int subarraySum(vector<int>& nums, int k) {unordered_map<int, int> prefix_sum_map; // 前缀和出现次数prefix_sum_map[0] = 1; // 初始化为0,表示从数组开头到当前元素和为k的子数组存在int current_sum = 0; // 当前前缀和int count = 0; // 子数组的个数for (int num : nums) {current_sum += num; // 更新当前前缀和if (prefix_sum_map.find(current_sum - k) != prefix_sum_map.end()) {count += prefix_sum_map[current_sum - k]; // 找到符合条件的子数组}prefix_sum_map[current_sum]++; // 更新前缀和的出现次数}return count;}
};
和为k的子数组的概念:就是从某个数开始到某个数结束(也可以是某个数自己开始到它自己结束),他们的和为k。
那反过来,先把数组中所有元素先进行从0开始的累加。如示例 进行累加之后将是:0,1,2,3
可以将原来的数组看作是一个数列{An},求和后的数列看作是{Sn},那么Sn-S(n-k)的结果就是从第(n-k)项开始到第n项的和,用Δ来接收这个数值,就是Δ=Sn-S(n-k),如果Δ=target,则表示找到了一次和为target的子序列,子序列从第(n-k)开始到第n结束,由于此时n和k都是任意数,所以用这个公式可以适用于题目要求。