有多少个连续子数组的奇数个数为k
可以记录下每个奇数左边的偶数的数的个数,
比如00010010000, k =2
那么选择了1001后,左边可以扩展3个0,右边可以扩展4个0,右边可以理解为下一个奇数的左边,这个在实现上会比较方便。
根据乘法原理,贡献的答案为(3+1)(4+1)
public int numberOfSubarrays(int[] nums, int k) {
int ans = 0;
int v = 0;
//每个奇数的左边有几个零
List<Integer> list = new ArrayList<>();
for (int x : nums) {
if (x % 2 == 0) v++;
else {
list.add(v);
v = 0;
}
}
//特殊处理,方便实现右边有几个0
list.add(v);
for (int i = 0; i < list.size(); i++) {
if (i + k < list.size()) ans += (list.get(i) + 1) * (list.get(i + k) + 1);
}
return ans;
}
还有其他的做法:
1、考虑转为0/1数组前缀和,使用map记录和为k的个数,满足s[i] - s[j] = k的s[j]的个数累加到答案里
2、还是前缀和,不过可以不用map,使用二分搜索有多少个满足答案的