public class Solution {
/**
* 原问题:字段奇数数量
* 新问题转化为:奇数看为1,偶数看为了(其实就是把数 % 2),统计字段和为K的字段数量
* sum(l,r) == k
* S[r] - S[l - 1] == k S是字段和数组
* 其实就是两数之差问题。枚举右端i(r),只需找到i 前面右多少个j(l-1)满足s[i] - s[j] == k
* @param nums
* @param k
* @return
*/
public int numberOfSubarrays(int[] nums, int k) {
Integer res = 0;
// 1:先计算出前缀和数组。注意前缀和数组要比nums长一位,因为为了方便从下表1开始走
int[] s = new int[nums.length + 1];
s[0] = 0;
for(int i = 1;i <= nums.length;i++){
//这里加数组的值
s[i] = s[i - 1] + nums[i - 1]%2;
}
//3 : 接下来就变成两数之差问题了。
Map<Integer,Integer> map = new HashMap<>();
for(int i : s){
if(i - k >= 0){
res = res + map.getOrDefault(i-k,0);
}
int num = map.getOrDefault(i,0) + 1;
map.put(i,num);
}
return res;
}
}