一、介绍
1.题目描述
题目链接:
https://leetcode-cn.com/problems/subarray-sum-equals-k/
给你一个整数数组 nums 和一个整数 k ,请你统计并返回该数组中和为 k 的连续子数组的个数。
2.测试样例
[1,1,1]
2
# 2
[1,2,3]
3
# 2
[0,0,0,0,0]
0
# 15
二、题解
1、map+前缀和🔴
我们定义pre[i]代表num[0]+num[1]+...+num[i]的和【即前n项的和】。
当某个连续序列num[j]+...num[i]=k,可以写为等式 pre[i]-pre[j-1]=k,移项得到pre[j-1]=pre[i]-k。
即问题转换为:当遍历到i时,只要找到前面有几个j,pre[j-1]的值满足pre[i]-k,总个数加该j的个数。
利用map记录pre[j]的值以及其对应的个数。
- 当遍历到
i,当前前缀和为pre[i]=x,要满足从j到i的子序列和为k,则j之前的序列和【即[0,j-1]的序列和】需要=x-k
参考链接:
class Solution {
public:
int subarraySum(vector<int>& nums, int k) {
// count记录答案,pre记录前面所有元素的和
int count = 0,n=nums.size(),pre=0;
unordered_map<int,int> mp; // mp记录前缀和及个数
mp[0]=1; // 初始化前缀和为0的个数是1
for(int i=0;i<n;i++){
pre+=nums[i];
if(mp.count(pre-k)) count+=mp[pre-k]; // 总个数更新
mp[pre]++; // mp 记录
}
return count;
}
};

本文解析了LeetCode题目Subarray Sum Equals K的解决方案,通过map数据结构和前缀和计算,快速统计数组中和为k的连续子数组数量。实例演示和代码实现有助于理解该算法在解决此类问题时的高效性。
994

被折叠的 条评论
为什么被折叠?



