【算法】【前缀和和差分】Leetcode560. 和为K的子数组

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

前缀和 + 枚举

class Solution {
public:
    int subarraySum(vector<int>& nums, int k) {
        int n = nums.size();
        vector<int> sums(n + 1, 0);
        for(int i = 0 ; i < n; i++)
            sums[i + 1] = sums[i] + nums[i];

        for(int i = 0; i < n + 1; i++)
            cout << sums[i] << " ";
        cout << endl;

        int cnt = 0;
        for(int i = 0; i < n; i++)
        {
            for(int j = i + 1; j < n + 1; j++)
            {
                int val = sums[j] - sums[i];
                if(val == k) cnt++;
            }
        }
        return cnt;
    }
};

前缀和 + 哈希 优化

class Solution {
public:
    int subarraySum(vector<int>& nums, int k) {
        int n = nums.size();
        int cnt = 0;
        int sum = 0;
        unordered_map<int, int> hashmap;
        hashmap[0] = 1;
        for(int i = 0; i < n; i++)
        {
            sum += nums[i];
            if(hashmap[sum - k])  cnt += hashmap[sum - k];
            hashmap[sum]++;
        }

        return cnt;
    }
};
posted @ 2020-08-20 10:41  NaughtyCoder  阅读(83)  评论(0)    收藏  举报