本题难度并不高,但是有点难想到,理解之后就非常简单了。
核心算法:
- 构建一个
HashMap<Integer, Integer>,key是和,value是出现的次数。 - 这个想法的最大阻碍是以为要算所有的subarray,这样复杂度就变成了
,其实不用!!只需要计算从
0开始的即可,找到sum,和sum-k即可.class Solution {public int subarraySum(int[] nums, int k) {if (nums == null || nums.length == 0) {throw new IllegalArgumentException("Invalid Input");}int sum = 0;Map<Integer, Integer> map = new HashMap<>();map.put(0, 1);int count = 0;for (int i = 0; i < nums.length; ++i) {sum += nums[i];if (map.containsKey(sum - k)) {count += map.get(sum - k);}if (map.containsKey(sum)) {map.put(sum, map.get(sum) + 1);}else {map.put(sum, 1);}}return count;}}
