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。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~