前言
个人网站
公众号: 北京程序猿, 网站 : https://yaml.vip
算法题
题干
给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数
示例
输入: nums = [1,1,1], k = 2
输出: 2 , [1,1] 与 [1,1] 为两种不同的情况。
说明
1. 数组的长度为 [1, 20,000]。
2. 数组中元素的范围是 [-1000, 1000] ,且整数 k 的范围是 [-1e7, 1e7]。
解法
- 暴力破解
- 与两数之和类似,通过HashMap存储中间sum值。和为k=新的sum-旧的sum,sum是通过for循环累加得到的,要想得到旧的sum值,需要通过某种方式(采用HashMap)将sum值存储下来。
Java代码
public int subarraySum(int[] nums, int k) {
final int LENGTH = nums.length;
Map<Integer, Integer> sumCount = new HashMap<>(16);
sumCount.put(0, 1);
int sum = 0;
int count = 0;
for (int i = 0; i < LENGTH; i++) {
sum += nums[i];
if (sumCount.containsKey(sum - k)) {
count += sumCount.get(sum - k);
}
sumCount.put(sum, sumCount.getOrDefault(sum, 0) + 1);
}
return count;
}
代码解析
- 第4行代码初始化HashMap。
- 第9-11行是这个算法题的重点,当数组指针循环到i时,此时0-i所有元素的和为sum,如果我们此时找和为k的子数组,就相当于找和为sum-k的子数组,sum-k的子数组有多少个,和为k的子数组就有多少个。
思考题
- 第四行代码, 为什么要初始化HashMap?
本文著作权归作者所有。
商业转载请联系作者获得授权,非商业转载请于文首标明作者姓名,保持文章完整性,并附上出处和文章链接!未按规范转载者,作者保留追究相应责任的权利!
作者:北京程序猿