560. 和为 K 的子数组

记录力扣学习~

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

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

示例 1:

复制代码
输入:nums = [1,1,1], k = 2
输出:2

思路:前缀和 + 哈希表记录前缀出现次数。通过遍历对数组进行累加得到 pre,在累加的过程中对前缀和出现的次数进行记录,然后对每次累加的结果判断是否存在一个前缀的和,使得 pre - k 等于这个前缀和。如果存在,那么说明一定存在一个连续的子数组和为k。因为这个前缀和是连续子数组组成的,且当前的前缀和 pre 也是由前面所有的数字累加起来的所以就一定存在一个连续子数组和为k。

公式更可观:当前pre = 当前遍历到的数字num[i] + 前面累计的前缀和。如果当前pre - k存在,那么这段 pre - k 构成的子数组一定是连续的因为哈希表存储的是连续的前缀和,又根据最开始的公式那么就可以知道,和为k的连续子数组 + nums[i] + (pre - k)所处的连续子数组 = 当前的pre。因为你只有连续的子数组 + 和为k的连续子数组才等于当前的前缀和。

力扣官方代码实现:

cpp 复制代码
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;
    }
};
相关推荐
Omigeq8 分钟前
1.4 - 曲线生成轨迹优化算法(以BSpline和ReedsShepp为例) - Python运动规划库教程(Python Motion Planning)
开发语言·人工智能·python·算法·机器人
网络工程小王30 分钟前
【大模型(LLM)的业务开发】学习笔记
人工智能·算法·机器学习
y = xⁿ31 分钟前
【Leet Code 】滑动窗口
java·算法·leetcode
WBluuue34 分钟前
数据结构与算法:二项式定理和二项式反演
c++·算法
nianniannnn34 分钟前
力扣104.二叉树的最大深度 110. 平衡二叉树
算法·leetcode·深度优先
_深海凉_44 分钟前
LeetCode热题100-只出现一次的数字
算法·leetcode·职场和发展
nianniannnn1 小时前
力扣206.反转链表 92.反转链表II
算法·leetcode·链表
澈2071 小时前
哈希表实战:从原理到手写实现
算法·哈希算法
旖-旎1 小时前
哈希表(存在重复元素||)(4)
数据结构·c++·算法·leetcode·哈希算法·散列表
Run_Teenage1 小时前
Linux:认识信号,理解信号的产生和处理
linux·运维·算法