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:
解法: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; } }
560. Subarray Sum Equals K - Medium
原文:https://www.cnblogs.com/fatttcat/p/10052251.html