560. 和为 K 的子数组
题目描述
给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的连续子数组的个数 。
输入输出
| 12
 3
 4
 5
 
 | 输入:nums = [1,1,1], k = 2输出:2
 
 输入:nums = [1,2,3], k = 3
 输出:2
 
 | 
基本思路
最佳的方法可以参照1. 两数之和 有相似之处 官方解答视频
设置一个pre[i]数组用来保存前缀和 num = [1,1,1], pre = [0,1,2,3]
哈希表用来保存<pre[i], 其出现的次数> 记录pre[i]出现的次数从左往右更新表答案
那么以i结尾的答案map[pre[i] - k]即可在O(1)内得到
java实现
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 
 | class Solution {
 public int subarraySum(int[] nums, int k) {
 int len = nums.length;
 int count = 0;
 for(int left = 0; left < len; left++){
 int sum = 0;
 for(int right = left; right < len; right++){
 sum += nums[right];
 if(sum == k) count++;
 }
 }
 return count;
 }
 }
 
 
 class Solution {
 public int subarraySum(int[] nums, int k) {
 int len = nums.length;
 int count = 0;
 int[] preSum = new int[len + 1];
 preSum[0] = 0;
 for(int i = 0; i < len; i++){
 preSum[i + 1] = preSum[i] + nums[i];
 }
 
 for(int left = 0; left < len; left++){
 for(int right = left; right < len; right++){
 if(preSum[right + 1] - preSum[left] == k){
 count++;
 }
 }
 }
 return count;
 }
 }
 
 
 class Solution {
 public int subarraySum(int[] nums, int k) {
 int len = nums.length;
 int count = 0;
 Map<Integer, Integer> preSumMap = new HashMap<Integer, Integer>();
 preSumMap.put(0, 1);
 int preSum = 0;
 for(int num:nums) {
 preSum += num;
 if(preSumMap.containsKey(preSum - k)) {
 count += preSumMap.get(preSum - k);
 }
 preSumMap.put(preSum, preSumMap.getOrDefault(preSum, 0) + 1);
 }
 return count;
 }
 }
 
 |