Subarray Sum Equals K

Given an array of integers and an integer k, you need to find the total number of >continuous subarrays whose sum equals to k.

Example 1:

Input:nums = [1,1,1], k = 2
Output: 2

Note:

  1. The length of the array is in range [1, 20,000].
  2. The range of numbers in the array is [-1000, 1000] and the range of the integer k is >[-1e7, 1e7].

分析

这道题开始并不容易想,因为不是典型的那种可以用DP解决的子数组类型的题。由于求的是子subarray和为K的总个数,只能想办法找出所有和为K的子数组,然后返回个数就可以。

那么关键点就是怎么找出所有和为K的子数组,bruce force的方法显然不可行。突破点就是我们可以把任意子数组的里面所有元素的和转化为两个子数组累计元素和之差,当然这个两个子数组指的是头元素是大数组第一个元素的连续子数组。这样一来,我们用一个HashMap来记录每个子数组元素和对应的次数就可以了。

我们从头开始读数组,记录下累计元素之和,把每次的和存在HashMap中,通过HashMap在每次读的过程中我们可以找出是否前面存在一个数组与当前数组之差等于K,这样我们就可以找出所以子数组之和为K的情况。由于存在前面子数组和相同的情况,我们用HashMap记录每个和对应的次数就可以了。

复杂度

time: O(n), space: O(n)

代码

class Solution {
    public int subarraySum(int[] nums, int k) {
        Map<Integer, Integer> map = new HashMap<>();
        map.put(0, 1);
        int sum = 0;
        int count = 0;
        for (int num : nums) {
            sum += num;
            if (map.containsKey(sum - k)) {
                count += map.get(sum - k);
            }
            map.put(sum, map.getOrDefault(sum, 0) + 1);
        }
        return count;
    }
}

微斯渝
39 声望15 粉丝