【LeetCode】560. 和为 K 的子数组

class Solution {
public:
    int subarraySum(vector<int>& nums, int k) {
        int n=nums.size();

        int presum[20010]={0};

        unordered_map<int,int> mp;
        mp[0]=1;  //前n项和0,出现次数为1次
        int ans = 0;

        for(int i=1;i<=n;++i)
        {
            presum[i]=presum[i-1]+nums[i-1];   //计算前缀和
            ans+=mp[presum[i]-k];  //去已经存入哈希表的前面的元素中寻找子连续数组
            ++mp[presum[i]];   //哈希表里面存储的是前n项和出现的次数
        }

        return ans;
    }
};

O(n)做法:记录前缀和,0项指全部为空,只有一种取法。其他细节见代码和注释。

posted @   Jerry2km1  阅读(22)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示