JZ010:和为K的子数组

📃 题目描述

题目链接:和为k的子数组leetcode一样的题目

image-20220509004025355

🔔 解题思路

连续子数组、达到一定值,这些条件好像都是滑动窗口的暗示啊,实际上,不能用滑动窗口!原因:滑动窗口必须都是正数或者负数,因为这样左右指针单向滑动才能一个负责增大 一个负责减少!

解法:前缀和 + 哈希表

通过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;
    }
};

图示:

image-20220509004956034

💥 复杂度分析

  • 时间复杂度:o(n);
  • 空间复杂度:O(n);
posted @ 2022-05-09 00:56  D-booker  阅读(47)  评论(0编辑  收藏  举报