Description
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].
Solution
给一个数组,找到数组中有多少个连续的子序列的和为k。
1.Brute force
Use two for loop, calculate from I to rear of nums[], if some sum is k, count++;
- Pre sum
sum[I, j] = sum[0, j] - sum[0, I]. So we could calculate pre sums, and store them in a Hash map. We put (0, 1) in the hash map for initial value. It means 1 frequence of sum = 0. Then iterate nums, for every num in numbers, if (curSum - k) is in preSum, it means cur - pre = k. So we could get the frequence by preSum.get(curSum - k).
For every calculated curSum, we should store it in preSum, if it is in, plus one; if not, 1. We could use getOrDefault() of hash map to realize it.
Code
1.Brute Force
class Solution {
public int subarraySum(int[] nums, int k) {
if (nums.length == 0)
return 0;
int count = 0;
for (int i = 0; i < nums.length; i++){
int sum = 0;
for (int j = 0; i + j < nums.length; j++){
sum += nums[i + j];
if (sum == k){
count++;
}
}
}
return count;
}
}
- Pre sum
class Solution {
public int subarraySum(int[] nums, int k) {
Map<Integer, Integer> preSum = new HashMap<Integer, Integer>();
preSum.put(0, 1);
int count = 0, curSum = 0;
for (int i = 0; i < nums.length; i++){
curSum += nums[i];
if (preSum.containsKey(curSum - k))
count += preSum.get(curSum - k);
preSum.put(curSum, preSum.getOrDefault(curSum, 0) + 1);
}
return count;
}
}
Time Complexity: O(n^2) O(n)
Space Complexity: O(1) O(n)