和为 K 的子数组
- 原题链接
- 思路
- 代码
原题链接
leet hot 100-10
560. 和为 K 的子数组
思路
看到连续非空数组 想到前缀和数组 首先记录前缀和 然后从前往后运算 计算当前位置的前缀和的大小 减少k个 那么这个数字在前缀和的数组中有多少时间复杂度O(n) 空间复杂度(n)
代码
class Solution {
public:
int subarraySum(vector<int>& nums, int k) {
int n = nums.size();
vector<int> sum(n+1); //来保存n+1个前缀和
for(int i =1 ;i<=n ;i++) sum[i] = sum[i-1]+nums[i-1] ;
unordered_map<int ,int> st; //来保存前缀和数组中 每个值出现的次数
st[0] =1;//表示前缀和为0的数组为1
int res = 0;
for(int i =1 ;i<=n ;i++)
{
res += st[sum[i] - k]; //sum[i]-k表示当前位置的前缀和减去k的大小 然后查看保存前缀和数组中是否有当前的值
st[sum[i]]++;
}
return res;
}
};