题目
代码(首刷看解析)
本来一开始用滑动窗口做的,但后来发现有负数,滑动窗口就不行了。
class Solution {
public:
int subarraySum(vector<int>& nums, int k) {
unordered_map<int, int> mp;
mp[0] = 1; // 如果和为0,方法为1
int ans = 0, pre = 0;
for(auto& x : nums) {
pre += x;
if(mp.count(pre - k)) {
ans += mp[pre-k];
}
mp[pre]++;
}
return ans;
}
};
代码(8.2 二刷看解析 GO)
用GO刷的第一道题。
思路是前缀和+哈希表。
遍历的时候, 就看看preSum[j]-k
在不在字典里, 如果在,就说明前面肯定存在preSum[i]
这样的角色,满足preSum[j]-preSum[i-1]==k
, 那么存在多少个这样的preSum[i]
角色呢? 这就是hashMap[preSum[i]]
了
func subarraySum(nums []int, k int) int {
mp := map[int]int{0:1} // 前缀和为0出现1次
// mp[0] = 1
res, sum := 0, 0
for i := 0; i < len(nums); i++ {
sum += nums[i]
if _, ok := mp[sum-k]; ok { // 如果存在
res += mp[sum-k]
}
mp[sum]++;
}
return res;
}
代码(9.23 三刷自解)
class Solution {
public:
int subarraySum(vector<int>& nums, int k) {
int pre = 0, ans = 0;
unordered_map<int, int> mp;
mp[0] = 1;
for(int num : nums) {
pre += num;
if(mp.count(pre-k)) {
ans += mp[pre-k];
}
mp[pre]++;
}
return ans;
}
};