Subarray Sum Equals K 子数组和为K(C++ 前缀和 + 哈希表)

Given an array of integers nums and an integer k, return the total number of subarrays whose sum equals to k.

A subarray is a contiguous non-empty sequence of elements within an array.

Example 1:

Input: nums = [1, 1, 1], k = 2
Output: 2

Example 2:

Input: nums = [1, 2, 3], k = 3
Output: 2

Constraints:

  • 1 <= nums.length <= 2 * 104
  • -1000 <= nums[i] <= 1000
  • -107 <= k <= 107

分析

前缀和 + 哈希表
前缀和,就是从数组0号元素开始,到当前元素的,所有元素的数值总和
mp[presum]表示  当前 数组元素之前,前缀和 为presum的子数组的 个数

图示

若所求K = 0:
在这里插入图片描述
遍历到每一个元素,都检查一遍有多少个符合条件的前缀和,然后再把当前前缀和添加到哈希表中,我们只要符合条件的数量,不要求具体是哪一个子数组,所以这样最快。
时间、空间复杂度都是 O ( n ) O(n) O(n)

代码

#include <unordered_map>

class Solution {
public:
    int subarraySum(vector<int>& nums, int k) {
        unordered_map<int, int> mp;
        mp[0] = 1; // 这一步很重要,表示在0号元素之前,有 1 个前缀和为 0 的子数组
        int sum = 0;
        int count = 0;
        for (int item: nums) {
            sum += item;      
            int presum = sum - k; // sum - presum == k的等价变换
            
            // 存在为mp[presum] 不存在为 0
            int pre_num = mp.count(presum) ? mp[presum] : 0; // 看有多少个符合条件的子数组
            // 这些子数组都是从0开始的前缀子数组
            // 所以,当前前缀和,减去之前的 符合条件的 前缀和的 数量,就是count要加上的
            count += pre_num;
            // 对于当前前缀和,存在加 1,不存在赋值 1
            mp[sum] = mp.count(sum) ? (mp[sum] + 1) : 1;
        }
        return count;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值