560. 和为 K 的子数组

2021-12-28  本文已影响0人  名字是乱打的

一 题目

二 思路:

三 代码:

暴力

class Solution {
    int count=0;

    //暴力法
    public int subarraySum(int[] nums, int k) {

        for (int i = 0; i < nums.length; i++) {
            int sum=0;
            for (int j = i; j < nums.length; j++) {
                sum+=nums[j];
                if (sum==k){
                    count++;
                }
            }
        }
        return count;
    }
}

前缀树

class Solution {
    int count=0;

    public int subarraySum(int[] nums, int k) {
        //存储从0~i项的和
        int[] sumArr=new int[nums.length+1];

        //存储值
        for (int i = 1; i < nums.length; i++) {
            sumArr[i]=sumArr[i-1]+nums[i-1];
        }

        for (int left = 0; left < nums.length; left++) {
            //第1~第k项
            for (int right = left+1; right <= nums.length; right++) {
                int sum=sumArr[right]-sumArr[left];
                if (sum==k){
                    count++;
                }
            }
        }
        return count;
    }

}

前缀树+hashmap

 class Solution {
    public int subarraySum(int[] nums, int k) {
        int count=0;
        Map<Integer, Integer> map = new HashMap<>();
        int sum=0;
        //如果前缀和直接等于K的话,即sum-k=0的时候我们需要赋初值,就是1。
        map.put(0, 1);
        for (int i=0; i<nums.length; i++) {
            sum += nums[i];
            if (map.containsKey(sum-k)) {
                count += map.get(sum-k);
            }
            if (map.containsKey(sum)) {
                map.put(sum, map.get(sum) + 1);
            } else {
                map.put(sum, 1);
            }
            
        }
        return count;
    }
}
上一篇 下一篇

猜你喜欢

热点阅读