leetcode560. 和为 K 的子数组(前缀和+hash)
链接:https://leetcode-cn.com/problems/subarray-sum-equals-k/
题目
- 和为 K 的子数组
 给你一个整数数组 nums 和一个整数 k ,请你统计并返回该数组中和为 k 的连续子数组的个数。
用例
示例 1:
输入:nums = [1,1,1], k = 2
输出:2
示例 2:
输入:nums = [1,2,3], k = 3
输出:2
提示:
1 <= nums.length <= 2 * 104
-1000 <= nums[i] <= 1000
-107 <= k <= 107
思路
做这题一开始没有注意到数组中存在负数 按照背包的思想去做
但实际上这是一道标准的前缀和问题
对于”xxxx个连续元素的值达成xx条件的问题“都可以用前缀和完成
注意初始化hash表
mp[0]=1 当前缀和为0(从头开始)的情况
遍历数组
记录累加前缀和值pre
查找pre-target的值在hash表中是否存在相同的前缀和 则增加其计数
把当前pre加入mp
class Solution {
public:
    int subarraySum(vector<int>& nums, int k) {
        unordered_map<int,int>mp;
        mp[0]=1;
        int count=0,pre=0;
        for(auto &x:nums){
            pre+=x;
            if(mp.find(pre-k)!=mp.end()){
                count+=mp[pre-k];
            }
            mp[pre]++;
        }
        return count;
    }
};
 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号