[LeetCode]剑指 Offer II 010. 和为 k 的子数组

和为 k 的子数组

Posted by JinFei on November 12, 2021

题目描述

给定一个整数数组和一个整数 k ,请找到该数组中和为 k 的连续子数组的个数。

Example1:

输入:nums = [1,1,1], k = 2 输出: 2 解释: 此题 [1,1] 与 [1,1] 为两种不同的情况

Example2:

输入:nums = [1,2,3], k = 3 输出: 2

Note:

  • 1 <= nums.length <= 2 * 10^4
  • -1000 <= nums[i] <= 1000
  • -10^7 <= k <= 10^7

解题思路

class Solution {
public:
    int subarraySum(vector<int>& nums, int k) {
        int pre[nums.size() + 1];
        pre[0] = 0;
        for(int i = 1; i <= nums.size(); i++){
            pre[i] = pre[i - 1] + nums[i - 1];
        }
        map<int, int> mmap;
        int ans = 0;
        for(int i = 0; i <= nums.size(); i++){
            if(mmap.count(pre[i] - k) != 0){
                ans += mmap[pre[i] - k];
            }
            mmap[pre[i]] += 1;
        }
        return ans;
    }
};