给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数。
示例 1 :
输入:nums = [1,1,1], k = 2
输出: 2 , [1,1] 与 [1,1] 为两种不同的情况。
说明 :
数组的长度为 [1, 20,000]。
数组中元素的范围是 [-1000, 1000] ,且整数 k 的范围是 [-1e7, 1e7]。
刚开始看到的时候想到了用HashMap记录前n项和,以及用当前前n项和减去之前任意的,如果有值为k,那么就有一组存在,但是我没想到的是map<key,val>中的key是用和,val是该和出现的次数,导致于一下没想出来。暴力破解谁都会,关键还是Map的应用吧。
代码是暴力和Map两种
//暴力破解
public int subarraySum(int[] nums, int k) {
int res = 0;
int numLength = nums.length;
for (int i = 0; i < numLength; ++i){
int tmpVal = 0;
for (int j = i; j < numLength; ++j){
tmpVal += nums[j];
if (tmpVal == k)
res++;
}
}
return res;
}
//优化后的方法
public int subarraySum1(int[] nums, int k){
int res = 0;
int indexVal = 0;
HashMap<Integer, Integer> numsMap = new HashMap<Integer, Integer>();
numsMap.put(0,1);
for (int num : nums){
indexVal += num;
int tmpVal = 0;
tmpVal = indexVal - k;
if(numsMap.containsKey(tmpVal)){
res += numsMap.get(tmpVal);
}
if (numsMap.containsKey(indexVal)){
numsMap.put(indexVal,numsMap.get(indexVal) + 1);
}else {
numsMap.put(indexVal,1);
}
}
return res;
}