前缀和
代码:
int subarraySum(int* nums, int numsSize, int k){
int co=0;
//求和
int sum[numsSize+1];
sum[0]=0;
int sum1=0;
for(int i=0;i<numsSize;i++)
{
sum1=sum1+nums[i];
sum[i+1]=sum1;
}
//遍历右端点
for(int i=0;i<numsSize+1;i++)
for(int j=i-1;j>=0;j--)
{
if(sum[i]-sum[j]==k)
co++;
}
return co;
}
#include<stdio.h>
#include<stdlib.h>
#define maxsize 1000
//从前向后遍历,和未满足则继续加,和刚好等于结果值加1,和超过则跳出当前循环 效率不高
//或动态规划?(不是动态规划)
//前缀和:每个位置先求和
int subarraySum(int* nums, int numsSize, int k){
int co=0;
//求和
int sum[numsSize+1];
sum[0]=0;
int sum1=0;
for(int i=0;i<numsSize;i++)
{
sum1=sum1+nums[i];
sum[i+1]=sum1;
}
//遍历右端点
for(int i=0;i<numsSize+1;i++)
for(int j=i-1;j>=0;j--)
{
if(sum[i]-sum[j]==k)
co++;
}
return co;
}
int main()
{
int numsSize=3;
int nums[]={1,2,3};
int k=3;
int c=0;
c=subarraySum(nums,numsSize,k);
printf("%d",c);
return 0;
}
结果:
前缀和&哈希表优化
和为K的子数组 - 和为 K 的子数组 - 力扣(LeetCode) 官方解答
代码
#include <bits/stdc++.h>
using namespace std;
int subarraySum(vector<int>& nums, int k) {
int co;
//变量和map
int pre=0;
map<int,int>mp;
mp[0] = 1;
//auto声明自动类型的变量,根据被赋值的类型自动推导变量的类型
for (auto& x:nums)
{
pre=pre+x;
if(mp.find(pre - k) != mp.end()) {
co+= mp[pre - k];//可以理解,但不好形容,想不到
}
mp[pre]++;
}
return co;
}
int main()
{
int n;
int k;
cin>>n;
int nums[n];
for(int i=0;i<n;i++)
cin>>nums[i];
cin>>k;
vector<int>a;
for(int i=0;i<n;++i){a.push_back(nums[i]);}
cout<<subarraySum(a,k)<<endl;
return 0;
}
class Solution {
public:
int subarraySum(vector<int>& nums, int k) {
int co;
//变量和map
int pre=0;
map<int,int>mp;
mp[0] = 1;
//auto声明自动类型的变量,根据被赋值的类型自动推导变量的类型
for (auto& x:nums)
{
pre=pre+x;
if(mp.find(pre - k) != mp.end()) {
co+= mp[pre - k];//可以理解,但不好形容,想不到
}
mp[pre]++;
}
return co;
}
};
结果