java leetcode之[数据结构 中等]560. 和为K的子数组

题目的链接在这里:https://leetcode-cn.com/problems/subarray-sum-equals-k/


题目大意

给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数。

一、示意图

在这里插入图片描述

二、解题思路

//然后统计这个位置
            //这个地方才是最关键的 为什么前缀和为 psum-k的个数就是 和为k的个数呢
            //原来是这样的 psum[i]=prum[i-1]+nums[i] 而这个子数组和为k的话
            //psum[i]-psum[j-1]=k  把这两个合并同类项 就是 psum[j-1]+k=prum[i-1]+nums[i]
            //就是变成了 psum[j-1]=psum[i]-k
            //简单来说就是 pre[j]-pre[i]之间的差是k ,所以当你能找到一次pre-k的时候,说明就是这个中间是存在一次的
            //简单来讲, map中的数据都是0~i (i的范围为0到nums.length-1) 的子数组和, 那么pre-k就是 0~j(j<i)的子数组和,如果在map里找到pre-k, j~i的子数组的和就是k了

哈希表和前缀和

代码如下:

class Solution {
    public int subarraySum(int[] nums, int k) {
        /**
         * 利用前缀和。这里使用hashmap,其键是前缀和,其值是前缀和出现的次数
         * 遍历到位置i的时候,假设当前的前缀和是 psum,那么hashmap[psum-k]就是以当前位置结尾
         * 满足条件的区间个数
         */
        int count=0,psum=0;
        HashMap<Integer,Integer> hashMap=new HashMap<>();
        hashMap.put(0,1);//所谓的初始化
        for(int i:nums){
            psum+=i;
            //然后统计这个位置
            //这个地方才是最关键的 为什么前缀和为 psum-k的个数就是 和为k的个数呢
            //原来是这样的 psum[i]=prum[i-1]+nums[i] 而这个子数组和为k的话
            //psum[i]-psum[j-1]=k  把这两个合并同类项 就是 psum[j-1]+k=prum[i-1]+nums[i]
            //就是变成了 psum[j-1]=psum[i]-k
            //简单来说就是 pre[j]-pre[i]之间的差是k ,所以当你能找到一次pre-k的时候,说明就是这个中间是存在一次的
            //简单来讲, map中的数据都是0~i (i的范围为0到nums.length-1) 的子数组和, 那么pre-k就是 0~j(j<i)的子数组和,如果在map里找到pre-k, j~i的子数组的和就是k了
            if(hashMap.containsKey(psum-k)) {
                count += hashMap.get(psum - k);
                //然后把对应位置加一
            }
            hashMap.put(psum,hashMap.getOrDefault(psum,0)+1);

        }
        return count;
    }
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值