本文已参与「新人创作礼」活动,一起开启掘金创作之路。
原文链接:blog.csdn.net/roufoo/arti…
Subarray Sum Equals K 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 Example1
Input: nums = [1,1,1] and k = 2 Output: 2 Explanation: subarray [0,1] and [1,2] Example2
Input: nums = [2,1,-1,1,2] and k = 3 Output: 4 Explanation: subarray [0,1], [1,4], [0,3] and [3,4]
解法1: 我一开始就是用暴力法,但最后会超时。
int subarraySumEqualsK(vector<int> &nums, int k) {
int n = nums.size();
if (n < k) return 0;
int count = 0;
vector<int> sums(n);
sums[0] = nums[0];
for (int i = 1; i < n; ++i) {
sums[i] = sums[i - 1] + nums[i];
}
for (int i = 1; i < n; ++i) {
if (sums[i] == k) count++;
for (int j = 0; j < i; ++j) {
if (sums[i] - sums[j] == k) count++;
}
}
return count;
}
解法2: 参考的网上的解法。感觉很巧妙。 主要思路就是用Hashmap<int, int>来存储Presum和其freq。 如果扫描到某个元素时发现hashmap[presum - k] > 0,说明前面某个presum = 当前presum - k,则把当前的hashmap[当前presum-k]加入到count中。 注意:为什么要设hashmap[0]=1? 看看input: [1,1,1] k = 2 当i=1时,presum = 2,而hashmap[2-2]=hashmap[0],此时count应该加1,所以hashmap[0]=1。 注意后面这个hashmap[0]还可能会变的。 比如说input: [0,0,0,0,0,0,0],hashmap[0]一开始设为1,后面每个i都会逐步累加,一直加到8。
代码如下:
class Solution {
public:
/**
* @param nums: a list of integer
* @param k: an integer
* @return: return an integer, denote the number of continuous subarrays whose sum equals to k
*/
int subarraySumEqualsK(vector<int>& nums, int k) {
int n = nums.size();
int count = 0, sum = 0;
unordered_map<int, int> hashmap; //preSum, freq
hashmap[0] = 1;
for (int i = 0; i < n; ++i) {
sum += nums[i];
count += hashmap[sum - k];
hashmap[sum]++;
}
return count;
}
};