- 和为K的子数组
给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数。
示例 1 :
输入:nums = [1,1,1], k = 2
输出: 2 , [1,1] 与 [1,1] 为两种不同的情况。
说明 :
数组的长度为 [1, 20,000]。
数组中元素的范围是 [-1000, 1000] ,且整数 k 的范围是 [-1e7, 1e7]。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/subarray-sum-equals-k
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
方法一:使用累计和,新建一个数组用来存放每个元素与之前所有元素的和,如果计算位于两个索引之间的元素之和,我们可以减去对应于两个索引的累积和以直接获得总和
class Solution {
public int subarraySum(int[] nums, int k) {
int count=0;
//新建一个数组用来存放每个元素与之前所有元素的和
int[] sum=new int[nums.length+1];
sum[0]=0;
for(int i=1;i<=nums.length;i++)
{
sum[i]=sum[i-1]+nums[i-1];
}
for(int start=0;start<sum.length-1;start++)
{
for(int end=start+1;end<sum.length;end++)
{
//减去对应于两个索引的累积和以得到两个索引之间元素的累计和
if(sum[end]-sum[start]==k)//如果两个索引之间的数的累计和为k,则为一个新的和为k的子数组
{
count++;
}
}
}
return count;
}
}
方法二:Hash Table,用一个哈希表来存放累加和,如果哈希表中包含key为累加和减去k的项,则将计数值加上对应key的val,然后将该累加和放到哈希表中,并将key为该累加和的val设为1,如果哈希表中已经存在key与该累加和相等,则将对应的key的val加一。
class Solution {
public int subarraySum(int[] nums, int k) {
//新建一个哈希表来存放累加和
HashMap<Integer,Integer> sum=new HashMap<>();
int count=0;
int sumNum=0;
sum.put(0,1);
//遍历数组中所有元素
for(int i=0;i<nums.length;i++)
{
sumNum+=nums[i];//计算累加和
//判断哈希表中是否包含key为累加和减去k的项
if(sum.containsKey(sumNum-k))
{
count+=sum.get(sumNum-k);//如果包含则将计数值加上对应key的val
}
//无论哈希表中是否包含key为累加和减去k的项,都要将新的累加和加入哈希表中
//如果不存在key与该累加和相等,则将该累加和与其val=1加入哈希表中,
//如果哈希表中已经存在key与该累加和相等,则将对应的key的val加一
sum.put(sumNum,sum.getOrDefault(sumNum,0)+1);
}
return count;
}
}