从左往右遍历,借助前缀和的思想,遍历到的位置作为子数组的末尾,那么看看前边是否存在合理的位置满足他俩之间的和为k

也就是判断前边是否有值为 当前位置的前缀和-k 的前缀和,如果有直接加上表示这几个位置都满足。

同样的从左往右保证了只会取到当前遍历位置的前边的位置,即使后边还有满足前缀和为该值的但不会造成影响,

class Solution {
public:
    int subarraySum(vector<int>& nums, int k) {
        /*
        int res=0;
        for(int i=0;i<nums.size();i++)
        {
            int temp=0;
            for(int j=i;j<nums.size();j++)
            {
                temp+=nums[j];
                if(temp==k)
                {
                    res+=1;
                }
            }
        }
        return res;
        */
        int res=0;
        int pre=0;
        unordered_map<int,int> m;
        m[0]=1;
        for(int i=0;i<nums.size();i++)
        {
            pre+=nums[i];
            if(m.count(pre-k))
            {
                res+=m[pre-k];
            }
            m[pre]++;
        }
        return res;
    }
};