class Solution {
public int subarraySum(int[] nums, int k) {
int count=0;
int n = nums.length;
//数组元素中有正有负
for (int i = 0; i < n; i++) {
int sum=0;
int j=i;
while (j<n){
sum+=nums[j];
j++;
if(sum==k){
count++;
}
}
}
return count;
}
}
1、哈希表
sum[i] = sum[i-1] + nums[i]
[L...R]这个子数组和为k——可以转化为 ' sum[R] - sum[L-1] == k '
以R结尾的和为k的连续子数组个数只要统计有多少个前缀和为sum[R]-k的sum[L-1]即可
建立HashMap,以sum[R]为键,出现次数为对应的值,记录sum[L]出现的次数
从左往右边更新map边计算答案,那么以R结尾的解可在O(1)时间内得到
从左往右边更新边计算的时候已经保证了map里记录的sum[L]的范围是0<=L<=R
由于sum[L]的计算只与前一项的答案有关,因此我们可以不用建立sum数组
class Solution {
public int subarraySum(int[] nums, int k) {
int count = 0;
Map<Integer,Integer> map = new HashMap<>();
map.put(0,1);
int n = nums.length;
int sum=0;
for (int num : nums) {
sum += num;
count+=map.getOrDefault(sum-k, 0);
map.put(sum, map.getOrDefault(sum, 0) + 1);
}
return count;
}
}