和为K的子数组 - 前缀和+哈希表
目录
1. 题目描述
2. 题解
1. 题目描述
给定一个整数数组和一个整数k
,你需要找到该数组中和为k
的连续的子数组的个数。
示例 1 :
输入:nums = [1,1,1], k = 2
输出: 2 , [1,1] 与 [1,1] 为两种不同的情况。
2. 题解
public int subarraySum(int[] nums, int k) {
int count = 0, pre = 0;
HashMap < Integer, Integer > mp = new HashMap < > ();
mp.put(0, 1);
for (int i = 0; i < nums.length; i++) {
pre += nums[i];
if (mp.containsKey(pre - k)) {
count += mp.get(pre - k);
}
mp.put(pre, mp.getOrDefault(pre, 0) + 1);
}
return count;
}
我们定义pre[i]
为[0...i]
里所有数的和。
假设和为k
的子数组下标范围为[j...i]
,于是pre[i] - k = pre[j - 1]
。
示例:nums = [3, 4, 7, 2, -3, 1, 4, 2], k = 7
遍历到nums[1]
时,哈希表mp
为{0=1, 3=1, 7=1}
,pre[1] - 7 = 0
,哈希表中存在键0
。
遍历到nums[2]
时,哈希表mp
为{0=1, 3=1, 7=1, 14=1}
,pre[2] - 7 = 7
,哈希表中存在键7
。
遍历到nums[5]
时,哈希表mp
为{0=1, 16=1, 3=1, 7=1, 13=1, 14=2}
,pre[5] - 7 = 7
,哈希表中存在键7
。
遍历到nums[7]
时,哈希表mp
为{0=1, 16=1, 18=1, 3=1, 20=1, 7=1, 13=1, 14=2}
,pre[7] - 7 = 13
,哈希表中存在键13
。
最后,和为k
的连续的子数组的个数为4
。
示例:nums = [3, 4, 7, 2, -3, 1, 4, 2, 1], k = 7
遍历到nums[8]
时,哈希表mp
为{0=1, 16=1, 18=1, 3=1, 20=1, 21=1, 7=1, 13=1, 14=2}
,pre[8] - 7 = 14
,哈希表中存在键14
。
最后,和为k
的连续的子数组的个数为6
。
符合条件的子数组个数多了两个,分别为[2, -3, 1, 4, 2, 1]
和[4, 2, 1]
。
哈希表中mp
中14=2
表示前缀和为14
的子数组出现了两次,这两个子数组分别为[3, 4, 7]
和[3, 4, 7, 2, -3, 1]
。
参考:
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
· .NET 适配 HarmonyOS 进展
· .NET 进程 stackoverflow异常后,还可以接收 TCP 连接请求吗?
· 本地部署 DeepSeek:小白也能轻松搞定!
· 基于DeepSeek R1 满血版大模型的个人知识库,回答都源自对你专属文件的深度学习。
· 在缓慢中沉淀,在挑战中重生!2024个人总结!
· 大人,时代变了! 赶快把自有业务的本地AI“模型”训练起来!
· Tinyfox 简易教程-1:Hello World!