和为K的子数组

文章目录

    • 题目
    • 代码
    • 原理图
    • 原理讲解
    • 结束

题目

和为K的子数组

给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的子数组的个数 。

子数组是数组中元素的连续非空序列。

示例 1:

输入:nums = [1,1,1], k = 2
输出:2
示例 2:

输入:nums = [1,2,3], k = 3
输出:2

提示:

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

代码

class Solution {
public:
    int subarraySum(vector<int>& nums, int k) {
        int res=0;//结果变量
        unordered_map<int,int>u_map;//字典用来存放 前缀和以及其出现的次数(count)
        int cur_sum=0;//初始化 前缀和为0
        u_map[cur_sum]=1; //初始化出现次数为1
        for(int i=0;i<nums.size();i++)//遍历数组
        {
            cur_sum+=nums[i];//累计前缀和
            if(u_map[cur_sum-k])//如果前缀和减去k存在 则将结果变量+count
            {
                res+=u_map[cur_sum-k];
            }
            u_map[cur_sum]+=1;//前缀和对应的count加1
        }
        return res;
    }
};

原理图

和为K的子数组_第1张图片

原理讲解

presum(前缀和)和count(统计前缀和出现的次数)分别初始化0、1,在代码中使用字典实现
第一步:前缀和为1,1-k=-1不在字典中,则前缀和1所对应的次数为1加入字典。
第二步:前缀和为0,0-k=-2不在字典中,则前缀和(键)对应的count+1=2
第三步:前缀和为1,1-k=-1不在字典中,则前缀和对应的count+1=2
第四步:前缀和为2,2-k=0在字典中,则将0对应的值(count)与res(结果)相加

红色圈与橙色圈即为子数组

结束

原理图借鉴哔站华南溜达虎,如有侵权联系删除。

你可能感兴趣的:(力扣每日一题,力扣)