剑指 Offer II 010. 和为 k 的子数组

这篇博客探讨了一种解决数组中寻找和为k的连续子数组的算法,由于负数的存在,传统的滑动窗口方法不再适用。作者提出了利用前缀和的概念,通过维护一个哈希映射来存储每个前缀和出现的次数。在遍历数组过程中,不断更新前缀和并查询哈希映射,从而统计和为k的子数组数量。这种方法巧妙地解决了问题,提高了效率。
摘要由CSDN通过智能技术生成

在这里插入图片描述

有点意思,因为有负数,所以滑动窗口失效了,这道题用前缀和解决。

什么叫前缀和?
s[0]=1
s[0]+s[1]=2
s[0]+s[1]+s[2]=3
所以s[1]+s[2]=3-2=1 懂了吗?

前缀和通常用来求子数组之和,所以本体应当先创造一个hashmap。

hashmap存放的数据格式是<当前节点前缀和 ,出现次数>

在遍历数组的过程中,每次都计算新结点的前缀和,然后将k-当前前缀和作为key值送入map中,查询之前出现过的次数。

count += 出现次数即可。

map.getOrDefault(key,v)的含义是在map中查询key值,如果查不到就默认返回v这个值,所以我们这可以把v设置成0,如果没有出现过符合条件的前缀和,就返回0.

class Solution {
    public int subarraySum(int[] nums, int k) {
        HashMap<Integer,Integer> map = new HashMap<Integer,Integer>();
        int res = 0;
        int count = 0;
        map.put(0,1);
        //一个循环解决
        //在循环的过程中,一边查询当前结点的前缀和,一边在map里寻找之前的前缀和
        //根据key值寻找,若二者相加等于k,res+1
        //每次循环都将当前结点的前缀和放入map中,并且计算前缀和且继续前进
        //注意初始化的过程中,这个0,1的含义主要是寻找第一个元素

        //注意 map中存放的格式为<value,次数>
        for(int i=0;i<nums.length;i++){
            res = res+nums[i];//当前结点的前缀

            count = count+map.getOrDefault(res-k,0);
            if(!map.containsKey(res)){
                map.put(res,1);
            } else {
                map.put(res,map.get(res)+1);
            }

            //该存放了
        }
        return count;



    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值