560. 和为 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

 

连续子数组 下标要连续

 

第一反应 一维前缀和。

子数组的前缀和怎么求,数组有起点和终点。

sum[i, j] = s[j] - s[i-1] = s[i] + ... + s[j]

看见这个i-1了 说明有边界要处理。

 

sum[]如果有n个 可以开n+1的长度,从0到n的下标

这样原来下标0的那个和可以用s[1] - s[0]去表示,S[0]初始化为0;

i从1到n,对应到下标n-1

s[i] = s[i-1] + a[i-1]

 

 

解题思路:

理解某个子数组的和为k意味着什么

意味着如果这个子数组和为k,它有起点下标i跟终点下标j,那么0到i的和 加上这段子数组的和 就会等于0到j的和,

所以要判断和为k存不存在,就看当for循环停在j的时候查存不存在一个i,使得从0到i的和会等于从0到j的和 - k,而i下标是多少又不关心,那么就可以考虑用哈希去优化

把从0到i的和存到表里初始化为1,当for停在j处去找这个sum - k的和时,找到了,看一下这个键的值是多少,就是到j为止会有多少个子数组的和为k了,然后再把0到j为止的和存起来,如果已经存在了 就加一。

 

 

建立map表用于存储每个连续子数组sum求和出现的次数,初始化为(0,1),表示和为0的连续子数组出现1次。

sum的值是在对nums数组的循环中不断累加当前元素的,res的值则需要查找map中是否已存在sum-k的元素,也就是在查找此前所有从0项开始累加的连续子项和中有没有sum-k。

如果有的话,则说明从该项到当前项的连续子数组和必定为k,那么res则可以和这个sum的对应值,即这个sum出现的次数,相加得到新的res。

对于当前sum如果已存在与map中则其对应值+1,不存在则添加新项,初始值为1。

建立map表用于存储每个连续子数组sum求和出现的次数,初始化为(0,1),表示和为0的连续子数组出现1次。
建立map表用于存储每个连续子数组sum求和出现的次数,初始化为(0,1),表示和为0的连续子数组出现1次。
建立map表用于存储每个连续子数组sum求和出现的次数,初始化为(0,1),表示和为0的连续子数组出现1次。
为什么要这么做
posted @   timeMachine331  阅读(15)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示