hot100----子串

52 阅读1分钟

和为K的子数组(leetcode.560)

class Solution {
public:
    int subarraySum(vector<int>& nums, int k) {
        int count = 0;
        int sum = 0;
        // 假设数组的前缀和数组为prefixSum,其中prefixSum[i]表示从数组起始位置到第i个位置的元素之和。那么对于任意的两个下标i和j(i < j),如果prefixSum[j] - prefixSum[i] = k,即从第i个位置到第j个位置的元素之和等于k,那么说明从第i+1个位置到第j个位置的连续子数组的和为k。

        // 前缀和集合,key为
        unordered_map<int,int> map;
        // nums[0]的前缀和必定为0,一开始就可以初始化前缀和为0的次数为1
        map[0] = 1;

        for(int i = 0;i < nums.size();i++){
            // sum用于记录每个元素的前缀和,每次循环多加一个元素
            sum+=nums[i];
            if(map.find(sum - k) != map.end()){
                // count记录符合题目条件的数组个数
                count += map[sum-k];
            }
            map[sum] = map[sum] + 1;
        }
        return count;
    }
};