leetcode560. 和为 K 的子数组(前缀和+hash)

链接:https://leetcode-cn.com/problems/subarray-sum-equals-k/

题目

  1. 和为 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;
    }
};
posted @ 2021-10-28 16:09  kitamu  阅读(43)  评论(0)    收藏  举报
Live2D