leetcode 560——和为k的子数组

题目描述:
给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数。

示例 1 :
在这里插入图片描述
说明:

  • 数组的长度为 [1, 20,000]。
  • 数组中元素的范围是 [-1000, 1000] ,且整数 k 的范围是 [-1e7, 1e7]。

解题思路:
扫描一遍数组, 对每个元素累加到sum,同时寻找map中是否有 sum-k 的元素,如果有则将答案加上 sum-k 的个数,最后将map中当前sum 的计数值加1,直至遍历完整个数组。

注意: 这里不好理解的是为什么map中有sum-k元素时将答案加上 sum-k 的个数即可,因为题目要求连续子数组的和,而我们是从前往后累加,假设 sum[0, i]为sum1,sum[0, j]为sum2 (i < j),如果 sum2 - k == sum1,则表示 sum[i+1, j] == k。(相当于从0加到j,再将前面的某些子数组减去即可)

代码实现:

class Solution {
public:
    int subarraySum(vector<int>& nums, int k) {
        map<int, int> iimap;
        iimap[0] = 1;
        int sum = 0, res = 0;
        
        for (int i = 0; i < nums.size(); ++i)
        {
            sum += nums[i];
            if (iimap.find(sum - k) != iimap.end())
                res += iimap[sum - k];
            
            iimap[sum] += 1;
        }
        
        return res;
    }
};
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页