力扣hot100 ——和为k的子数组 前后缀和(积)各种情况总结
给你一个整数数组 nums
和一个整数 k
,请你统计并返回 该数组中和为 k
的子数组的个数 。
子数组是数组中元素的连续非空序列。
解法思路:
构建前缀和数组,以快速计算区间和;注意在计算区间和的时候,下标有偏移。
class Solution {
public:
int subarraySum(vector<int>& nums, int k) {
int res = 0;
int cur_sum = 0;
unordered_map<int,int> pre_map;
int pre = 0;
pre_map[pre] = 1;
for(auto &num : nums){
pre +=num;
if(pre_map[pre - k]){
res+=pre_map[pre-k];
}
pre_map[pre] +=1;
}
return res;
}
};
重点!!!
前后缀各种情况计算方法
// 笔记
// 1.求前缀和
// 包含自身
int pre = 0;
for(auto & num : nums){
pre += num; // 每次遍历出来的 pre 即 每个元素的前缀和
}
// 不包含自身
for(int i = 1; i<nums.size();i++){
pre += num[i-1]; // 此处注意,是从1开始,即第二个元素的前缀和就是第一个元素,第一个元素的前缀和为0
}
// 后缀和
// // 包含自己
int back = nums[nums.size-1];
for(int i = nums.size -2;i<=0; i--){
back += num[i];
}
// 不包含自己
int back = 0;
for(int i = nums.size -2;i<=0; i--){
back += nums[i+1];
}
// 前后缀积则将 + 变为 * 即可