和等于K的子数组

和等于K的子数组

问题描述

给定一个整数数组,返回子数组的个数,这些子数组的和为K。

image-20201125174349534

解决方案

法一:可以使用DP来解决,因为dp[i][j] = dp[0][j] - dp[0][i],其中dp表示下标i+1到下标i之间的和。这种算法的时间复杂度为$O(n^2)$。

法二:采用字典(Map)才存储每个值出现的次数

这种方法只需要经历一次遍历,问题的核心是求sum[i][j] == k,而根据公式sum[i][j] = sum[0][i] + sum[0][j]可知,如果把 j 作为遍历的指针,而把sum[0][i]存储在字典中,那么当sum[0][j] - k = sum[0][i]时,我们就找到了结果,并且结果的个数取决于字典中键等于sum[0][i]的个数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Solution {
public int subarraySum(int[] nums, int k) {
int count = 0, sum = 0;
HashMap<Integer, Integer> map = new HashMap<>();
map.put(0, 1);
for(int i = 0; i < nums.length; i++){
sum += nums[i];
if(map.containsKey(sum - k)){
count += map.get(sum - k);
}
map.put(sum, map.getOrDefault(sum, 0) + 1);
}
return count;
}
}

和等于K的子数组
http://example.com/2023/01/10/和等于K的子数组/
作者
Chen Shuwen
发布于
2023年1月10日
许可协议