JZ010:和为K的子数组
📃 题目描述
题目链接:和为k的子数组、leetcode一样的题目
🔔 解题思路
连续子数组、达到一定值,这些条件好像都是滑动窗口的暗示啊,实际上,不能用滑动窗口!原因:滑动窗口必须都是正数或者负数,因为这样左右指针单向滑动才能一个负责增大 一个负责减少!
解法:前缀和 + 哈希表
通过pre计算前缀,同时不断将前缀加入哈希表mp中,哈希表存储的就是前缀的和,通过:当前遍历到的前缀pre - 中间子数组k =前面的前缀 来求解!
class Solution {
public:
int subarraySum(vector<int>& nums, int k) {
unordered_map<int, int> mp;
mp[0] = 1; //确保可以 以第一个元素未子数组左边界
int res = 0, pre = 0; // pre为前缀和
for (int i = 0; i < nums.size(); i++) {
pre += nums[i];
if (mp.find(pre - k) != mp.end()) res += mp[pre - k];
mp[pre]++;
}
return res;
}
};
图示:
💥 复杂度分析
- 时间复杂度:o(n);
- 空间复杂度:O(n);