LeetCode 560. Subarray Sum Equals K


LeetCode 560. Subarray Sum Equals K (和为 K 的子数组)

题目

链接

https://leetcode-cn.com/problems/subarray-sum-equals-k/

问题描述

给你一个整数数组 nums 和一个整数 k ,请你统计并返回该数组中和为 k 的连续子数组的个数。

示例

输入:nums = [1,1,1], k = 2
输出:2

提示

1 <= nums.length <= 2 * 104
-1000 <= nums[i] <= 1000
-107 <= k <= 107

思路

与304类似,也是前缀和思路,把每个数的前缀和存起来。同时也要计算前面有没有符合差值为k的区间,考虑到值有正负,这里采用hashmap存放,分别为前缀和值,和该值的数量,遍历结束即可得到答案。

需要注意的有,最开始时要把数对<0,1>加入,用于处理包含开头的数。

复杂度分析

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

代码

Java

    public int subarraySum(int[] nums, int k) {
        int ans = 0;
        HashMap map = new HashMap<>();
        map.put(0,1);
        int sum = 0;
        for (int i = 0; i < nums.length; i++) {
            sum += nums[i];
            int need = sum - k;
            if (map.containsKey(need)) {
                ans += map.get(need);
            }
            map.put(sum, map.getOrDefault(sum, 0) + 1);
        }

        return ans;
    }