浏览器标题切换
浏览器标题切换end

LeetCode 560. 和为K的子数组(前缀和+哈希+问题转化)

思路

  1. 把问题转化成 求任意两个前缀和A和前缀和B的差 = K

  2. 用哈希表unordered_map存:每一个前缀和的出现次数

  3. 比如说 前缀和A已经存在了哈希表中,且A出现过两次,那么现在走到前缀和B的位置,一旦B-K的值在哈希表里出现过,说明有这个子数组存在,且个数是哈希表对应的value值

额外测试数据

题目给的数据不是很好推过程

测试数据:3 4 5 2 -3 1 4 2 k=7 -> ans=4

注意k=0的数据

  • nums=1 k=0 -> 0

  • nums=-1,-1,1 k=0 ->1

AC代码

class Solution {
public:
    int subarraySum(vector<int>& nums, int k) {
        int sum[20010];
        memset(sum,0,sizeof(sum));
        
        unordered_map<int,int>mp; // 底层哈希表 ,记录出现次数而不是是否出现过
        int ans=0;
        mp[0]=1; // *** 一定要加上!
        for(int i=0;i<nums.size();i++) // i是索引
        // for(auto &i:nums) // i是值,不是索引! 索引需要额外开一个变量index记录
        {
            if(i==0) // 初始化
                sum[0]=nums[i];
            else
                sum[i]=sum[i-1]+nums[i];
            if(mp[sum[i]-k]) ans+=mp[sum[i]-k];
            mp[sum[i]]++; // 上一步判断完再标记!否则 1 k=0会输出1而不是正确答案0
        }

        return ans;
    }
};
posted @ 2024-03-17 06:13  抓水母的派大星  阅读(5)  评论(0编辑  收藏  举报