题目
给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数。
题目地址
思想
暴力法:枚举法,先遍历包含第一个数的所有数组,在依次遍历包含第二个数的所有数组,以此类推
前缀和+哈希表优化:
代码
暴力法:
C++:
class Solution {
public:
int subarraySum(vector<int>& nums, int k) {
int sum = 0;
int length = nums.size();
for(int i = 0; i < length; i++){
int num = 0;
for(int j = i; j < length; j++){
num += nums[j];
if(num == k){
sum++;
}
}
}
return sum;
}
};
Java:
class Solution {
public int subarraySum(int[] nums, int k) {
int sum = 0;
int length = nums.length;
for(int i = 0; i < length; i++){
int num = 0;
for(int j = i; j < length; j++){
num += nums[j];
if(num == k){
sum++;
}
}
}
return sum;
}
}
前缀和+哈希表优化:
C++:
class Solution {
public:
int subarraySum(vector<int>& nums, int k) {
unordered_map<int, int> mp;
mp[0] = 1;
int count = 0, pre = 0;
for (auto& x:nums) {
pre += x;
if (mp.find(pre - k) != mp.end()) {
count += mp[pre - k];
}
mp[pre]++;
}
return count;
}
};
Java:
public class Solution {
public int subarraySum(int[] nums, int k) {
int count = 0, pre = 0;
HashMap < Integer, Integer > mp = new HashMap < > ();
mp.put(0, 1);
for (int i = 0; i < nums.length; i++) {
pre += nums[i];
if (mp.containsKey(pre - k)) {
count += mp.get(pre - k);
}
mp.put(pre, mp.getOrDefault(pre, 0) + 1);
}
return count;
}
}