问题描述:给定一个整数数组和一个整数k,你需要找到该数组中和为k的连续子数组的个数。
暴力求解:枚举数组nums中的所有子数组,然后统计子数组和等于k的个数。
public int foreSumK(int []nums)
{
int number=0;
for(int i=0;i<nums.length;i++)
{
int sum=0;
for(int j=i;j<nums.length;j++)
{
sum+=nums[j];
if(sum==k){number++;}
}
}
return number;
}
递归方法求解:每一个元素都有选或者不选两种状态。
int number=0;
public void dfs(int []nums,int level,int sum)
{
if(level>=nums.length){return;}
if(sum+nums[level]==k){number++;}
dfs(nums,level+1,sum+nums[level]);
dfs(nums,level+1,sum);
}
public int Dfs(int[]nums,int level)
{
dfs(nums,0,0);
return number;
}
前缀和求解:
定义pre[i]为前面所有0到i个元素的总和,要求i到j之间的元素和,直接使用pre[j]-pre[i-1]即可,只要两者相减等于k,则表示找到了一个子数组,由于k值是固定的,对于确定的pre[j],只要找打pre[i-1]即可,可以使用map进行保存。
public int foreSumK(int[]nums)
{
int pre[]=new int[nums.length];
pre[0]=nums[0];
for(int i=1;i<nums.length;i++)
{
pre[i]=nums[i]+pre[i-1];
}
Map<Integer,Integer>map=new HashMap<>();
for(int i=0;i<nums.length;i++)
{
map.put(nums[i],map.getOrDefault(nums[i],0)+1);
}
int number=0;
for(int i=0;i<nums.length;i++)
{
if(map.containsKey(pre[i]-k))
{
number+=map.get(pre[i]-k);
}
}
return number;
}