【LeetCode】560. 和为 K 的子数组

560. 和为 K 的子数组(中等)

在这里插入图片描述
【LeetCode】560. 和为 K 的子数组_第1张图片
在这里插入图片描述

方法:前缀和 + 哈希表

思路

  • 容易想到的方法是枚举法,我一开始的做法是:先计算数组 nums 的一维前缀和,然后对每一个下标 i ,枚举所有大于等于 i 的下标 j,计算它们之间的差,如果差为 k ,说明 nums[i:j] 的和为 k。这种做法的时间复杂度是 O(n2),超时。

  • 那么我们如何优化呢?显然,前缀和可能存在大量重复的值,为了避免重复计算,我们应该引入哈希表,其键值分别对应前缀和出现次数

  • 那么如何得到哈希表呢?直接遍历前缀和数组,然后统计前缀和及其对应的出现次数?这样没办法保证数组之间的有序性。因此,我们可以从左向右遍历,边更新哈希表,并同时判断此时是否满足和为k。

    【LeetCode】560. 和为 K 的子数组_第2张图片

代码

class Solution {
public:
    int subarraySum(vector<int>& nums, int k) {
        int ans = 0;
        // mp[前缀和] = 出现次数
        unordered_map<int, int> mp;
        mp[0] = 1;
        int preSum = 0;
        for(int i=0; i<nums.size(); i++){
            preSum += nums[i];
            if(mp[preSum-k]){
                ans += mp[preSum-k];
            }
            if(mp[preSum]){
                mp[preSum]++;
            }else{
                mp[preSum] = 1;
            }
        }
        return ans;
    }
};

你可能感兴趣的:(LeetCode刷题,leetcode,算法,职场和发展)