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

在这里插入图片描述

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

什么叫前缀和?
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;



    }
}

猜你喜欢

转载自blog.csdn.net/qq_37772958/article/details/121844412