500元做网站免费获客平台
1 题目:和为 K 的子数组
官方标定难度:中
给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的子数组的个数 。
子数组是数组中元素的连续非空序列。
示例 1:
输入:nums = [1,1,1], k = 2
输出:2
示例 2:
输入:nums = [1,2,3], k = 3
输出:2
提示:
1 < = n u m s . l e n g t h < = 2 ∗ 1 0 4 1 <= nums.length <= 2 * 10^4 1<=nums.length<=2∗104
− 1000 < = n u m s [ i ] < = 1000 -1000 <= nums[i] <= 1000 −1000<=nums[i]<=1000
− 1 0 7 < = k < = 1 0 7 -10^7 <= k <= 10^7 −107<=k<=107
2 solution
本题需要反复计算区间和,所以用前缀和——减法代替区间求和。还需要反复验证有没有连个数的差是否是目标数,所以可以用 hashmap 。
代码
class Solution {
public:
int subarraySum(vector<int> &nums, int k) {/** 计算前缀和,用 hashmap 存储, 动态查看有之前有几个值满足 pre_sum[i] - k,记录下来*/unordered_map<int, int> pre;int sum = 0;int pre_sum = 0;for(int i = 0; i < nums.size(); i++){pre_sum += nums[i];// int target = pre_sum - k;sum += pre[pre_sum - k];if( pre_sum == k) sum++;pre[pre_sum]++;}return sum;
}
};