题目 |
题目传送门:传送门(点击此处)
题解 |
思路
- 仔细分析一下题目,我们要找的是当前数组的连续子数组,其实不一定非得要把每个数组都找到,只要能算出最后的数量就可以了,所以,我们需要思考一下,如何确定这个数量是需要考虑的
- 简化一下,只要找到每个奇数前后的数字的个数,我们就能确定每种可能的个输了
给定一个数组,和一个k值
我们找到这个数组中每个奇数间隔数字的个数表如下:
到现在可能还不是很明确为什么要维护这个表,这个表的含义:
第 1
行:第 1
个奇数之前的偶数个数 + 1
第 2
行:第 2
个奇数到第 3
个奇数之间的偶数的个数 + 1
第 3
行:第 3
个奇数到第 4
个奇数之间的偶数的个数 + 1
第 4
行:第 3
个奇数到最后的偶数个数 + 1
加 1 是代表可能出现的情况数
下面举个例子,这里列出了所有的情况,很容易看出,找带有两个奇数的数组,我们只需要考虑两个奇数 左边
和 右边
的偶数的个数即可
下图 蓝色
的部分,1 2 2 1
左边有三种情况:0个2
、1个2
、2个2
,1 2 2 1
右边有四种情况:0个2
、1个2
、2个2
、3个2
,所以这时就一共有 3 * 4 = 12
种情况
下图 绿色
的部分,1 2 2 2 1
左边有三种情况:0个2
、1个2
、2个2
,1 2 2 2 1
右边有1种情况:0个2
,所以这时就一共有 3 * 1 = 3
种情况
由此,可以计算出结果为 12 + 3 = 15
种情况
code
class Solution {
public int numberOfSubarrays(int[] nums, int k) {
int res = 0;
List<Integer> list = new ArrayList();
int len = nums.length;
int count = 1;
for(int i = 0; i < len; i++) {
int temp = nums[i] % 2;
if(temp == 0) {
count++;
}
else {
list.add(count);
count = 1;
}
}
list.add(count);
int size = list.size();
if(k > size - 1) return 0;
for(int i = 0; i < size - k; i++) {
res += list.get(i) * list.get(i + k);
}
return res;
}
}