题目描述:
给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数。
示例 1 :
输入:nums = [1,1,1], k = 2
输出: 2 , [1,1] 与 [1,1] 为两种不同的情况。
说明 :
数组的长度为 [1, 20,000]。
数组中元素的范围是 [-1000, 1000] ,且整数 k 的范围是 [-1e7, 1e7]。
先将前i的和放入到sum数组中,然后针对每个索引区间进行计算,这时候求和就直接减去就可以了
class Solution {
public int subarraySum(int[] nums, int k) {
int time = 0;
int []sum = Arrays.copyOf(nums,nums.length);
for (int i = 1; i < sum.length; i++) {
sum[i] = sum[i - 1] + sum[i];
}
for (int i = 0; i < nums.length; i++) {
for (int j = i; j < sum.length; j++) {
if(get1(sum, i, j) == k){
time ++;
}
}
}
return time;
}
public int get1(int sum[],int start,int end){
if(start == 0){
return sum[end];
}else {
return sum[end] - sum[start - 1];
}
}
}
换个思路:
使用Hash表,需要注意的是初始化的put(0,1),因为如果sum为k那么表示从开始的和就是k,因此初始化为1,接下来我们只需要更新map并且计算sum - k在表中出现的次数。
Map<Integer, Integer> map = new HashMap<>();
int time = 0;
int sum = 0;
map.put(0, 1);
for (int i : nums) {
sum += i;
time += map.getOrDefault(sum - k, 0);
map.put(sum, map.getOrDefault(sum, 0) + 1);
}
return time;
速度明显提升。