560. Subarray Sum Equals K
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.
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].
Difficulty:Medium
Example:
Input:nums = [1,1,1], k = 2
Output: 2
方法1:双循环遍历
- Time complexity : O ( n 2 ) O\left ( n^{2} \right ) O(n2)
- Space complexity :
O
(
1
)
O\left ( 1 \right )
O(1)
思路:
固定子数组的开头,然后尾指针一直移动到原数组最后,累计sum,当sum=k时,count+1。
class Solution {
public:
int subarraySum(vector<int>& nums, int k) {
int len = nums.size();
int count = 0;
for (int i = 0; i < len; i++) {
int sum = 0;
for (int j = i; j < len; j++) {
sum += nums[j];
if (sum == k)
count++;
}
}
return count;
}
};
方法2:HsahMap
- Time complexity : O ( n ) O\left ( n \right ) O(n)
- Space complexity :
O
(
n
)
O\left ( n \right )
O(n)
思路:
通俗来讲,每次从当前位置i
向后找一个子数组,使得sum(nums[x:i]) = k
,就等同于从头找一个子数组,使得sum(nums[0:x]) = sum(nums[0:i])-k
具体做法,建立HashMap保存历史的累加sums出现的次数,每次新元素进来的时候去找历史上有没有出现过sum-k
,将出现次数加给count
关键点:
先查找hash map 再将sums记录进去,边界问题。
class Solution {
public:
int subarraySum(vector<int>& nums, int k) {
int len = nums.size();
int count = 0;
int sums = 0;
unordered_map<int, int> hash_map;
hash_map[0] = 1;
for (int i = 0; i < len; i++) {
sums += nums[i];
if (hash_map.find(sums - k) != hash_map.end())
count += hash_map[sums - k];
hash_map[sums]++;
}
return count;
}
};