和为 k 的连续的子数组的个数

思路

暴力破解就不记录了,主要是前缀和加map的思路.
用map记录pre前缀和出现的次数。开始时前缀和为0,出现1次。
所以map[0] = 1;
如果之前已经出现过,那么map[pre] += 1;

遍历时,每次使用pre-k查询map,是否出现,如果出现cout += map[pre - k];否则跳过

int subarraySum(vector<int>& nums, int k) {
        std::unordered_map<int, int> map;
        int pre = 0;
        map[0] = 1;
        int sz = nums.size();
        int count = 0;
        for (int i = 0; i < sz; ++i) {
            pre += nums[i];
            auto iter = map.find(pre - k);
            if (iter != map.end()) {
                count += iter->second;
            }
            iter = map.find(pre);
            if(iter != map.end()) {
                map[pre] += 1;
            }else {
                map[pre] = 1;
            }
        }
        return count;
    }
posted @ 2021-07-12 20:17  cyssmile  阅读(111)  评论(0)    收藏  举报