标签:问题 col detail 就是 sub 更新 hose 相同 时间
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
标签:问题 col detail 就是 sub 更新 hose 相同 时间
原文地址:https://www.cnblogs.com/fatttcat/p/10052251.html