题目描述
给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数。
样例描述
输入:nums = [1,1,1], k = 2
输出: 2 , [1,1] 与 [1,1] 为两种不同的情况。
思路
方法一:暴力法 不断以每个数为起点来往后枚举区间,查找符合条件的区间
双重循环就完事了
方法二:前缀和数组
//前缀和数组 从1开始的
int presum[] = new int[len + 1];
for (int i = 0; i < len; i ++ ) {
presum[i + 1] = presum[i] + nums[i];
}
最优方法:前缀和 + 哈希表
细节注意:map初值(0, 1),比如对于某个数,本身就是k,不需要加(就是相当于加0),要算成一次
哈希表来统计每个前缀和的次数,要找s[i] - s[j] = k,也就是对于每个s[j]找s[i] - k,如果后者存在的话,次数就加一
代码
方法一:
class Solution {
public int subarraySum