uacs2024

导航

leetcode 560. 和为 K 的子数组

560. 和为 K 的子数组

暴力解超时🤡

灵神题解

 

class Solution {
public:
    int subarraySum(vector<int>& nums, int k) {
        int size = nums.size(), res = 0; // size是数组长度,res是结果计数器
        vector<int> acc(size + 1); // 创建一个前缀和数组,长度为原数组长度+1
        
        // 填充前缀和数组,acc[0] = 0,acc[1] = nums[0],acc[2] = nums[0]+nums[1],以此类推
        for (int i = 0; i < size; ++i)  acc[i + 1] = acc[i] + nums[i];
               
        unordered_map<int, int> cnt; // 创建一个哈希表,用于记录前缀和出现的次数
        
        // 遍历前缀和数组,计算符合条件的子数组数量
        for (int &a : acc) {
            // 检查是否存在前缀和 a - k,如果存在,说明存在以当前索引结尾的子数组和为k
            // 注意:这里不能直接用 cnt[a - k],因为如果 a - k 不存在,会插入一个默认值0,导致错误
            res += cnt.contains(a - k) ? cnt[a - k] : 0;
            
            // 将当前前缀和 a 出现的次数加1,存入哈希表中
            cnt[a]++;
        }
        
        return res; // 返回符合条件的子数组数量
    }
};

 

posted on 2025-03-15 12:15  ᶜʸᵃⁿ  阅读(15)  评论(0)    收藏  举报