解题思路:
第i个奇数和第i+k-1个质数之间一定有K个奇数(第1个和第1+3-1个之间有3个,1,2,3三个)
因为数组是按顺序的,所以这两个奇数之间的偶数一定在这个子数组里
所以是第i个奇数和第i-1个奇数之间的偶数,第I+k-1个奇数和i+k个奇数之间的偶数
他们产生的排列组合产生了数组的变化
而组合种类是第i个奇数的下标-第i-1个奇数的下标 * 第i+k个奇数的下标-第i+k-1个奇数的下标
我们假设左边有三个偶数,右边有四个偶数
为什么种类不是3的4次方呢?
这是因为我们的子数组是有顺序的,所以左面只有三种选择,而对应的每种选择右边都有四种选择
所以就是3*4
数据结构:
我们建立一个数组,储存每个奇数的下标
然后遍历这个数组,将每组奇数产生子数组的可能性加在一起,就是所有的可能性
所以时间复杂度是O(N)
C++代码:
class Solution {
public:
int numberOfSubarrays(vector<int>& nums, int k) {
int i,j=0;
int n=(int)nums.size();
int ji[n+2];
for(i=0;i<n;++i)
{
if(nums[i]%2!=0)
{
ji[++j]=i;
}
}
int sum=0;
ji[0]=-1;ji[++j]=n;
for(i=1;i+k<=j;++i)
{
sum+=(ji[i]-ji[i-1])*(ji[i+k]-ji[i+k-1]);
}
return sum;
}
};
打卡成功!
继续努力