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;
    }
};
相关推荐
iAkuya3 小时前
(leetcode)力扣100 62N皇后问题 (普通回溯(使用set存储),位运算回溯)
算法·leetcode·职场和发展
近津薪荼3 小时前
dfs专题5——(二叉搜索树中第 K 小的元素)
c++·学习·算法·深度优先
xiaoye-duck3 小时前
吃透 C++ STL list:从基础使用到特性对比,解锁链表容器高效用法
c++·算法·stl
松☆3 小时前
CANN与大模型推理:在边缘端高效运行7B参数语言模型的实践指南
人工智能·算法·语言模型
java干货4 小时前
为什么 “File 10“ 排在 “File 2“ 前面?解决文件名排序的终极算法:自然排序
开发语言·python·算法
皮皮哎哟4 小时前
数据结构:嵌入式常用排序与查找算法精讲
数据结构·算法·排序算法·二分查找·快速排序
程序员清洒4 小时前
CANN模型剪枝:从敏感度感知到硬件稀疏加速的全链路压缩实战
算法·机器学习·剪枝
vortex54 小时前
几种 dump hash 方式对比分析
算法·哈希算法
堕2744 小时前
java数据结构当中的《排序》(一 )
java·数据结构·排序算法
2302_813806225 小时前
【嵌入式修炼:数据结构篇】——数据结构总结
数据结构