LeetCode 560 和为K的子数组[哈希表 前缀和] HERODING的LeetCode之路
Posted HERODING23
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 560 和为K的子数组[哈希表 前缀和] HERODING的LeetCode之路相关的知识,希望对你有一定的参考价值。
解题思路:
首先看到这题想到的是哈希表+暴力,但是现实总是残酷的,上来直接吃瘪,代码如下:
class Solution {
public:
int subarraySum(vector<int>& nums, int k) {
unordered_map<int, int> count;
count[k] = 0;
int len = nums.size();
for(int i = 0; i < len; i ++) {
int sum = 0;
for(int j = i; j < len; j ++) {
sum += nums[j];
count[sum] ++;
}
}
return count[k];
}
};
那就得考虑将时间复杂度优化为O(n)的情况,前缀和的思想给了我很大启发,用sum表示前缀和,当遍历到当前的数时,如果sum - k存在,那么前缀和sum-k的位置和sum的位置之间的和一定是k,这就是我们想要的集合!代码如下:
class Solution {
public:
int subarraySum(vector<int>& nums, int k) {
unordered_map<int, int> count;
count[0] = 1;
int len = nums.size(), sum = 0, res = 0;
for(int i = 0; i < len; i ++) {
sum += nums[i];
// 查询 sum - k 是否存在
if(count.find(sum - k) != count.end()) {
res += count[sum - k];
}
count[sum] ++;
}
return res;
}
};
/*作者:heroding
链接:https://leetcode-cn.com/problems/subarray-sum-equals-k/solution/cqian-zhui-he-ha-xi-biao-by-heroding-nc7h/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。*/
以上是关于LeetCode 560 和为K的子数组[哈希表 前缀和] HERODING的LeetCode之路的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode 560 和为K的子数组[哈希表 前缀和] HERODING的LeetCode之路