给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数。
示例 1 :
输入:nums = [1,1,1], k = 2
输出: 2 , [1,1] 与 [1,1] 为两种不同的情况。
说明 :
数组的长度为 [1, 20,000]。
数组中元素的范围是 [-1000, 1000] ,且整数 k 的范围是 [-1e7, 1e7]。
思路:哈希表 时间复杂度O(N)
一开始想用滑动窗口做,但是发现负数,然后。。。。滑不动啊
从头开始遍历数组,依次把nums[i]加到sum,用哈希表来存每次的和
HashMap < Integer, Integer > 哈希表的第一个值key指的是sum的值,第二个值value指的是这个值出现的次数
我们寻找sum-k的值出现的次数即可
为什么是sum-k呢? sum-(sum-k)=k
例如:从i=0开始到当前位置i的和为sum,而如果哈希表里面存在键值为sum-k数,他表示的是从i=0到位置为x的和为sum-k
那么从位置为x+1到位置为i的和就是k,我们只需要观察k的value是多少,也就是他出现了多少次
提交的代码:
class Solution {
public int subarraySum(int[] nums, int k) {
int count = 0, sum = 0;
HashMap < Integer, Integer > map = new HashMap < > ();
map.put(0, 1);
for(int i=0;i<nums.length;i++)
{
sum+=nums[i];
if(map.containsKey(sum-k))
{
count+=map.get(sum-k);//获得sum-k出现的次数
}
map.put(sum, map.getOrDefault(sum, 0)+1);
//如果这个sum之前出现过,那么给他的次数+1,如果没出现过,那么就是第一次出现,把他添加进哈希表,存的是(sum,1)
}
return count;
}
}