前缀和思想。遍历数组求前缀和,把前缀和以及这个和出现的次数作为键值对存入哈希表中。
举例理解:数组的前i
个数字之和记为sum
,如果存在一个j(j < i)
,数组的前j
个数字之和为sum - k
,那么数组中从第j + 1
个数字开始到第i
个数字结束的子数组之和为k
。
class Solution {
public:
int subarraySum(vector<int>& nums, int k) {
if (nums.empty()) return 0;
//哈希表的键是前i个数字之和,值为每个和出现的次数
unordered_map<int, int> hash;
hash[0] = 1; //初始化和为0的子数组出现了一次(空数组)
int sum = 0;
int count = 0;
for (int &num : nums)
{
sum += num;
count += hash[sum - k];
hash[sum] ++ ; //存入前缀和键值对
}
return count;
}
};