LeetCode 热门100题-和为 K 的子数组-错题

题目描述:

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

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

示例 1:

复制代码
输入:nums = [1,1,1], k = 2
输出:2
cpp 复制代码
class Solution {
public:
    int subarraySum(vector<int>& nums, int k) {
        unordered_map<int, int> prefix_sum_map; // 前缀和出现次数
        prefix_sum_map[0] = 1; // 初始化为0,表示从数组开头到当前元素和为k的子数组存在
        int current_sum = 0; // 当前前缀和
        int count = 0; // 子数组的个数
        
        for (int num : nums) {
            current_sum += num; // 更新当前前缀和
            if (prefix_sum_map.find(current_sum - k) != prefix_sum_map.end()) {
                count += prefix_sum_map[current_sum - k]; // 找到符合条件的子数组
            }
            prefix_sum_map[current_sum]++; // 更新前缀和的出现次数
        }
        
        return count;
    }
};

和为k的子数组的概念:就是从某个数开始到某个数结束(也可以是某个数自己开始到它自己结束),他们的和为k。

那反过来,先把数组中所有元素先进行从0开始的累加。如示例 进行累加之后将是:0,1,2,3

可以将原来的数组看作是一个数列{An},求和后的数列看作是{Sn},那么Sn-S(n-k)的结果就是从第(n-k)项开始到第n项的和,用Δ来接收这个数值,就是Δ=Sn-S(n-k),如果Δ=target,则表示找到了一次和为target的子序列,子序列从第(n-k)开始到第n结束,由于此时n和k都是任意数,所以用这个公式可以适用于题目要求。

错题记录:

复制代码
class Solution {
public:
    int subarraySum(vector<int>& nums, int k) {
        int result=0;
        int sum=0;
        unordered_map<int,int> Sn;
        Sn[0]=1;
        for(const int& num:nums)
        {
            sum+=num;
            if(Sn.find(sum-k)!=Sn.end())   //注意是当前和-k  ,一开始给的k-sum了
            {
                result+=Sn[sum-k];
            }
            Sn[sum]++;
        }
        return result;
    }
};
相关推荐
侯小啾14 分钟前
【23】C语言 左移(<<) 与 右移(>>) 位运算符在处理像素中的应用
c语言·算法·位运算·右移·左移
搂鱼11451423 分钟前
(dp 优化)洛谷 P14460 寻雾启示 题解
算法·图论
_OP_CHEN35 分钟前
算法基础篇:(十一)贪心算法拓展之区间问题:从重叠到覆盖的最优解艺术
算法·贪心算法
钟智强1 小时前
线性映射(Linear Mapping)原理详解:机器学习中的数学基石
人工智能·算法·机器学习
Sylvia-girl2 小时前
数据结构之线性表中的顺序表(1)
数据结构
福尔摩斯张3 小时前
C语言核心:string函数族处理与递归实战
c语言·开发语言·数据结构·c++·算法·c#
2501_941884613 小时前
云计算与边缘计算:解锁未来计算架构的智能边界
leetcode
程序猿小白日记3 小时前
云计算与物联网融合:推动智慧城市的未来发展
leetcode
吗~喽3 小时前
【LeetCode】滑动窗口_水果成篮_C++
c++·算法·leetcode
立志成为大牛的小牛4 小时前
数据结构——四十九、B树的删除与插入
数据结构·学习·程序人生·考研·算法