560. 和为K的子数组(前后缀+哈希)

在这里插入图片描述

暴力
// class Solution {
// public:
//     int subarraySum(vector<int>& nums, int k) {
//         int n=nums.size();
//         //以i开头
//         int res=0;
//         for(int i=0;i<n;i++){
//             int sum=0;
//             for(int j=i;j<n;j++){
//                 sum+=nums[j];
//                 cout<<sum<<endl;
//                 if(sum==k) res+=1;
  
//             }
//         }
//         return res;
//     }
// };

后缀和
class Solution {
public:
    int subarraySum(vector<int>& nums, int k) {
        int n=nums.size();
        //以i开头
        int suffix=0;
        int res=0;
        map<int,int> mp;
        mp[0]=1;// 这个是重点,以[1,1,1] k=2
        for(int i=n-1;i>=0;i--){
            suffix+=nums[i];
            // cout<<suffix<<endl;
            if(mp.find(suffix-k)!=mp.end()) res+=mp[suffix-k];
             mp[suffix]++;//放在if 后边,放在if前测试[1],k=0 无法通过
        }
        return res;
    }
};

猜你喜欢

转载自blog.csdn.net/qq_38662930/article/details/107919823