560. Subarray Sum Equals K - Medium

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].

解法:hashmap + prefix sum (cummulative sum)

prefix sum:

prefixsum[x] = sum of subarray(0, x) = nums[0] + ... + nums[x] = prefixsum[x-1] + nums[x]

e.g. index      0  1  2

  nums      [1, 1, 1]

  prefix sum [0, 1, 2, 3]    sum of subarray(i, j) = prefixsum[j] - prefixsum[i-1]

用了prefix sum,问题就转化为 j > i时,求有多少对<i, j>满足 prefixsum[j] - prefixsum[i-1] = k -> prefixsum[j]  - k = prefixsum[i-1]

detail:

用hashmap存 连续子数组之和(sum = nums[0] + ... + nums[i]) 及其出现次数,以便查找sum-k出现的次数(有多少prefix sums等于sum - k,nums[0] + ... + nums[j] = sum - k,就有相同数目的prefix sums,nums[j+1] + ... + nums[i] = k)。

遍历nums中元素,累加当前元素更新sum,在map中查找key=sum-k出现的次数(即,在遍历过的数组元素中,prefixsum[i-1] = prefixsum[j]  - k 出现的次数),然后更新当前prefixsum在map中的次数。

注意:map初始化,map.put(0, 1)!即当sum刚好等于k的时候,从数组下标为0到当前位置这一子数组的和就是k,也符合题意。

时间:O(N),空间:O(N)

class Solution {
    public int subarraySum(int[] nums, int k) {
        HashMap<Integer, Integer> map = new HashMap<>();
        int sum = 0, res = 0;
        map.put(0, 1);
        for(int i = 0; i < nums.length; i++) {
            sum += nums[i];
            res += map.getOrDefault(sum - k, 0);
            map.put(sum, map.getOrDefault(sum, 0) + 1);
        }
        return res;
    }
}

猜你喜欢

转载自www.cnblogs.com/fatttcat/p/10052251.html