560. 和为 K 的子数组

该代码提供了一个算法,使用哈希表来计算给定整数数组中和为特定值k的连续子数组数量。时间复杂度为O(n),空间复杂度为O(n),适用于解决此类问题。
摘要由CSDN通过智能技术生成
class Solution {
public:
    int subarraySum(vector<int>& nums, int k) {
        unordered_map<int, int> mp;
        mp[0] = 1;
        int count = 0, pre = 0;
        for (auto& x : nums)
        {
            pre += x;
            if (mp.find(pre - k) != mp.end())
            {
                count += mp[pre - k];
            }
            mp[pre] ++;
        }
        return count;
    }
};

这段代码是一个解决特定问题的算法实现,即寻找和为特定值 k 的连续子数组的数量。下面是具体的步骤讲解:

  1. unordered_map<int, int> mp; 创建一个哈希表,用于存储前缀和及其出现的次数。

  2. mp[0] = 1; 初始化哈希表,将前缀和为 0 的计数设置为 1,这是为了处理当子数组的起始点在数组的第一个元素之前的情况。

  3. int count = 0, pre = 0; 初始化计数器 count,用于记录和为 k 的子数组的数量,以及前缀和 pre

  4. for (auto& x : nums) 遍历输入数组 nums 中的每个元素。

  5. pre += x; 更新当前的前缀和,将当前元素 x 的值加到 pre 上。

  6. if (mp.find(pre - k) != mp.end()) 检查是否存在一个前缀和,使得 pre - (pre - k) = k,即从某个点到当前元素的和为 k

  7. count += mp[pre - k]; 如果存在这样的前缀和,说明找到了一个和为 k 的子数组,将这个前缀和对应的次数加到 count 上。

  8. mp[pre] ++; 更新哈希表,将当前的前缀和 pre 的计数增加 1。

  9. return count; 遍历完成后,返回计数器 count 的值,即和为 k 的子数组的数量。

这个算法的时间复杂度是 O(n),其中 n 是数组 nums 的长度,因为算法只需要遍历数组一次。空间复杂度是 O(n),因为需要存储前缀和的哈希表,最坏情况下前缀和的数量与数组的长度相同。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值