和为k的子数组
- 1. 题目解析
- 2. 讲解算法原理
- 3. 编写代码
1. 题目解析
题目地址:点这里
2. 讲解算法原理
-
创建一个无序映射(哈希表) hash,用于统计前缀和的出现次数。初始时,将前缀和为 0 的次数设为 1,表示从数组开头到当前位置的累计和为 0 的子数组个数为 1。
-
初始化两个变量 sum 和 ret,分别表示当前的前缀和和满足条件的子数组个数,初始时都设为 0。
-
遍历数组 nums 的每个元素 e:
-
将 e 加到 sum 中,更新当前的前缀和。
-
检查 hash 中是否存在前缀和为 sum - k 的记录,即是否存在一个位置 i,使得从位置 i 到当前位置的子数组的和为 k。如果存在,将 hash[sum - k] 的值累加到 ret 中,表示找到了满足条件的子数组。
-
更新 hash[sum],将前缀和 sum 的出现次数加 1。
-
完成遍历后,返回 ret,即满足条件的子数组的个数。
3. 编写代码
class Solution {
public:int subarraySum(vector<int>& nums, int k) {unordered_map<int,int> hash;//统计前缀和次数hash[0]=1;int sum=0,ret=0;for(auto e:nums){sum+=e;if(hash.count(sum-k)) ret+=hash[sum-k];hash[sum]++;}return ret;}
};