560. 和为 K 的子数组
难度中等1271收藏分享切换为英文接收动态反馈
给你一个整数数组 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
*思路
- 暴力枚举,二重循环
- 前缀和+哈希表优化
- 前缀和
pre[i]记录nums[0]……nums[i]的和
pre[j]记录nums[0]……nums[j]的和
nums[j]……nums[j]之和可以用pre[i]-pre[j]表示
找到和为k,即pre[i]-pre[j]=k,
由此我们可以通过找到对应的pre[j]=pre[i]-k来反推哪个区间符合要求
- 哈希表
查找部分,我们采用unordered_map<int,int> mp;这个结构
key:pre[]前缀和
value:存在的个数
代码
暴力枚举
class Solution {
public:
int subarraySum(vector<int>& nums, int k) {
int count=0;
for(int i=0;i<nums.size();i++)
{
int sum=0;
for(int j=i;j<nums.size();j++)
{
sum+=nums[j];
if(sum==k)
count++;
}
}
return count;
}
};
前缀和+哈希表优化
class Solution {
public:
int subarraySum(vector<int>& nums, int k) {
int sum=0,count=0;
unordered_map<int,int> mp;
mp[0]=1;
//前缀和
for(int i=0;i<nums.size();i++)
{
sum+=nums[i];
//查找
if(mp.find(sum-k) != mp.end())
{
count+=mp[sum-k];
}
mp[sum]++;//存在就累加
}
return count;
}
};