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之路

⭐算法入门⭐《哈希表》中等02 —— LeetCode 560. 和为K的子数组

560. 和为 K 的子数组-哈希表

leetcode中等560和为k的子数组

LeetCode-560. 和为 K 的子数组

Leetcode 560.和为k的子数组