0
点赞
收藏
分享

微信扫一扫

力扣hot100:560.和为K的子数组(前缀和+哈希表)

茗越 03-06 10:30 阅读 2

前缀和+哈希表

class Solution {
public:
    int subarraySum(vector<int>& nums, int k) {//前缀和+双指针
        vector<int> sum(nums.size());
        unordered_map<int,int> hmap;
        hmap[0]=1;//总和为0的情况 不加入元素时就有一种情况。
        long long ans=0;

        for(int i=0;i<nums.size();++i){
            if(i==0) sum[i]=nums[i];
            else sum[i]=sum[i-1]+nums[i];
            if(hmap.find(sum[i]-k)!=hmap.end()){//查看sum[i]-k在之前出现过没,如果出现过,则答案包含这个
                ans+=hmap[sum[i]-k];//sum[i]-sum[j]=k;
            }
            hmap[sum[i]]+=1;
        }
        return ans;
    }
};

空间优化:

class Solution {
public:
    int subarraySum(vector<int>& nums, int k) {//前缀和+双指针
        int sum=0;
        unordered_map<int,int> hmap;
        hmap[0]=1;//总和为0的情况 一开始就有
        long long ans=0;

        for(int i=0;i<nums.size();++i){
            sum+=nums[i];
            if(hmap.find(sum-k)!=hmap.end()){//查看k-sum[i]在之前出现过没,如果出现过,则答案包含这个
                ans+=hmap[sum-k];//sum[i]-sum[j]=k;
            }
            hmap[sum]+=1;
        }
        return ans;
    }
};
举报

相关推荐

0 条评论