浏览器标题切换
浏览器标题切换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 @   抓水母的派大星  阅读(14)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」
历史上的今天:
2021-03-17 Intern Day28 - URL内部分析
2021-03-17 Intern Day28 - PostgreSQL - 事务transaction
2020-03-17 寒假Day54:POJ3254-Corn Fields-状压dp入门题
2020-03-17 寒假Day54:poj2378-Tree Cutting-没用树形dp写的树的题-dfs
2020-03-17 寒假Day54:HDU5976-Detachment-前缀和+前缀积+逆元(费马小定理)+二分
点击右上角即可分享
微信分享提示