Given an array of integers and an integer k, you need to find the total number of continuous subarrays whose sum equals to k.
Example 1:
Input:nums = [1,1,1], k = 2
Output: 2
Note:
The length of the array is in range [1, 20,000].
The range of numbers in the array is [-1000, 1000] and the range of the integer k is [-1e7, 1e7].
题解:
Subarray sum的问题大部分都是用prefix sum来解。
sums[i] 代表前i个数的和,注意不可漏了最开始的0,总共长度应为原数组size+1
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];
可以进一步优化,去掉这个数组
用hashmap存前面出现过的前缀和,扫到你的时候,比你的和小K的前缀和应该要已经出现了的。
这个必须要按顺序从前往后扫,不能打乱顺序排序的
本来考虑K=0会不会情况不一样,比划了一样发现是一样的。
public 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);
map.put(sum, map.getOrDefault(sum, 0) + 1);
}
return count;
}
}