LeetCode Notes_#560 和为k的子数组

LeetCode Notes_#560 和为k的子数组

Contents

题目


解答

最简单的思路就是暴力法,遍历所有连续子数组,检查是否满足和为K,如果是则计数器增加1。这样的复杂度是O(n2),由于输入数组是比较大的,所以暴力法是过不了的。

方法1:前缀和+哈希表

参考前缀和技巧详解 - 和为K的子数组

class Solution {
    public int subarraySum(int[] nums, int k) {
        //map保存的是前缀和出现的次数,key是前缀和,value是次数
        HashMap<Integer, Integer> map = new HashMap<>();
        //参考labuladoong的题解,这里是因为前缀和数组是比nums数组多出一位,所以要额外进行一次初始化
        map.put(0,1);
        //sum表示前缀和,在循环过程中不断的累加更新,count表示和为k的子数组的个数,同样是一边循环一边更新
        int sum = 0, count = 0;
        for(int i = 0; i < nums.length; i++){
            sum += nums[i];
            if(map.containsKey(sum - k)){
                count += map.get(sum - k);
            }
            //统计前缀和的次数
            map.put(sum, map.getOrDefault(sum, 0) + 1);
        }
        return count;
    }
}

复杂度分析

时间复杂度:O(n)
空间复杂度:O(n)

原文地址:https://www.cnblogs.com/Howfars/p/14405948.html