LeetCode 560:和为 K 的子数组(前缀和+哈希表解法)
创作时间:
作者:
@小白创作中心
LeetCode 560:和为 K 的子数组(前缀和+哈希表解法)
引用
CSDN
1.
https://blog.csdn.net/IronmanJay/article/details/143077096
本文将详细讲解LeetCode第560题“和为 K 的子数组”的解题思路和代码实现。这是一道中等难度的题目,主要考察前缀和与哈希表的结合使用。通过本文的讲解,读者将能够掌握如何使用前缀和+哈希表的算法来解决此类问题。
一、题目类别
- 前缀和
二、题目难度
- 中等
三、题目编号
- 560.和为 K 的子数组
四、题目描述
- 给你一个整数数组
nums
和一个整数k
,请你统计并返回该数组中和为k
的子数组的个数。 - 子数组是数组中元素的连续非空序列。
五、题目示例
示例 1:
- 输入:nums = [1,1,1], k = 2
- 输出:2
示例 2:
- 输入:nums = [1,2,3], k = 3
- 输出:2
六、题目提示
- $1 \le nums.length \le 2 \times 10^4$
- $-1000 \le nums[i] \le 1000$
- $-10^7 \le k \le 10^7$
七、解题思路
使用前缀和+哈希表解决该问题
在本题中,我们使用哈希表记录当前前缀和的出现次数
在每次得到新的前缀和时,就去哈希表中找“当前前缀和 - k”的值对应的次数,“当前前缀和 - k”对应的就是“之前前缀和”
这样,我们就找到满足“之前前缀和 + 当前前缀和 = k”的子数组,即和为 K 的子数组
通过这种方法,可以有效地降低时间复杂度
最后返回结果即可
具体细节可以参考下面的代码
八、时空频度
- 时间复杂度:$O(n)$,n 为传入的数组的长度
- 空间复杂度:$O(n)$,n 为传入的数组的长度
九、代码实现
Java语言版
class Solution {
public int subarraySum(int[] nums, int k) {
// 初始化哈希表,前缀和为0的情况为1次
HashMap<Integer, Integer> hashMap = new HashMap<>();
hashMap.put(0, 1);
// 记录满足条件的子数组个数
int count = 0;
// 初始化前缀和
int prefixSum = 0;
for (int num : nums) {
// 计算当前的前缀和
prefixSum += num;
// 检查是否存在 prefix_sum - k 的前缀和
if (hashMap.containsKey(prefixSum - k)) {
// 加上满足条件的前缀和个数
count += hashMap.get(prefixSum - k);
}
// 更新哈希表中的当前前缀和出现次数
hashMap.put(prefixSum, hashMap.getOrDefault(prefixSum, 0) + 1);
}
return count;
}
}
Python语言版
class Solution:
def subarraySum(self, nums: List[int], k: int) -> int:
# 初始化哈希表,前缀和为0的情况为1次
hash_map = {0 : 1}
# 记录满足条件的子数组个数
count = 0
# 初始化前缀和
prefix_sum = 0
for num in nums:
# 计算当前的前缀和
prefix_sum += num
# 检查是否存在 prefix_sum - k 的前缀和
if prefix_sum - k in hash_map:
# 加上满足条件的前缀和个数
count += hash_map[prefix_sum - k]
# 更新哈希表中的当前前缀和出现次数
hash_map[prefix_sum] = hash_map.get(prefix_sum, 0) + 1
return count
C++语言版
class Solution {
public:
int subarraySum(vector<int>& nums, int k) {
// 初始化哈希表,前缀和为0的情况为1次
unordered_map<int, int> hashMap;
hashMap[0] = 1;
// 记录满足条件的子数组个数
int count = 0;
// 初始化前缀和
int prefixSum = 0;
for (int num : nums) {
// 计算当前的前缀和
prefixSum += num;
// 检查是否存在 prefix_sum - k 的前缀和
if (hashMap.find(prefixSum - k) != hashMap.end()) {
// 加上满足条件的前缀和个数
count += hashMap[prefixSum - k];
}
// 更新哈希表中的当前前缀和出现次数
hashMap[prefixSum]++;
}
return count;
}
};
十、提交结果
Java语言版
Python语言版
C++语言版
热门推荐
尿酸高不只害痛风「风吹就会痛」!简鈺樺营养师:高尿酸隐藏4大类疾病风险
月季花的功效与作用(食用/护肤/观赏/药用)
如何让癌症营养补充品更有效?专家建议:需搭配营养师
2025 年商标续展全攻略:流程、费用与常见问题解答
和光同尘,与时舒卷
求职防骗指南 别让这些套路“坑”了你
项目质量和制程质量区别
天然气压裂返排液与石油压裂返排液的区别
肝内偏强回声怎么回事
生物惰性液相质谱联用系统直接进样法分析食品中草甘膦和氨甲基膦酸
拉萨十大特色美食,你都吃过几种!
研究发现:胰腺癌初期不是口渴多尿,而是悄悄出现这3个小信号
公职人员是什么?从定义到职责的全面解析
如何练就徒手写出千行Verilog代码的能力
服务供给开新篇丨把家政做成“家门口的民生工程”
黄金的购买途径和注意事项有哪些?如何选择合适的购买渠道?
摩托车撞人了怎么处理
2025年中国收音机行业发展历程、产业链图谱、发展现状及未来前景分析
春季,警惕抑郁症高发!这份心理健康指南请收好
西湖大学科学家在大脑中“定位”抑郁症
為什麼結婚戒指要戴在無名指上?其實背後有這些文化意義!
“橘生淮南则为橘”:从典故到现代应用的文化解读
电脑开机黑屏怎么办?六步排查法帮你轻松应对
解决音频文件无法播放问题的实用指南分享
过生日是过农历的,还是阴历的?生日不能随便过,这些讲究要知道
孩子过生日,到底选“阳历还是阴历”?知道这些讲究,不纠结
汽车倒车时为什么会发出咯噔声
倒车雷达声音与距离,倒车雷达怎么判断距离
曼联2028年英超夺冠展望:雄心与现实的多维博弈
玉米期货价格波动的影响因素及应对策略