560. Subarray Sum Equals K
laioffer: https://www.youtube.com/watch?v=aYfwus5T3Bs
方法1: brute force
O(n^2)
class Solution {
public:
int subarraySum(vector<int>& nums, int k) {
int result = 0;
for (int i = 0; i < nums.size(); i ++){
int sum = 0;
for (int j = i; j < nums.size(); j ++){
sum += nums[j];
if (sum == k) result++;
}
}
return result;
}
};
方法2: prefix sum
O(n^2)
比第一种还慢,和brute force原理一样却更耗费space complexity的方法
易错点:
- 前缀和的大小是n + 1,第一个是0,简化运算
int subarraySum(vector<int>& nums, int k) {
int result = 0;
vector<int> presum(nums.size() + 1, 0);
for (int i = 0; i < nums.size(); i++){
presum[i + 1] = presum[i] + nums[i];
}
for (int i = 1; i < presum.size(); i ++){
for (int j = i; j < presum.size(); j ++){
int sum = presum[j] - presum[i - 1];
if (sum == k) result++;
}
}
return result;
}
};
方法3: hash
O(n)
易错点:
- 循环中3个语句的顺序不能换, 第二句和第三句如果换了当k = 0 的时候,会累加到result = nums.size()。hash 的含义是:已知以 i 为终点的sum,之前有多少以0为起始,和为sum-k的subarray,就要累加多少种解
int subarraySum(vector<int>& nums, int k){
int result = 0;
unordered_map<int, int> presum;
int sum = 0;
//
presum[sum] = 1;
for (int i = 0; i < nums.size(); i++){
sum += nums[i];
result += presum[sum - k];
++ presum[sum];
}
return result;
}
};