给你一个整数数组 nums
和一个整数 k
。
如果某个 连续 子数组中恰好有 k
个奇数数字,我们就认为这个子数组是「优美子数组」。
请返回这个数组中「优美子数组」的数目。
示例 1:
输入:nums = [1,1,2,1,1], k = 3 输出:2 解释:包含 3 个奇数的子数组是 [1,1,2,1] 和 [1,2,1,1] 。
示例 2:
输入:nums = [2,4,6], k = 1 输出:0 解释:数列中不包含任何奇数,所以不存在优美子数组。
示例 3:
输入:nums = [2,2,2,1,2,2,1,2,2,2], k = 2 输出:16
提示:
1 <= nums.length <= 50000
1 <= nums[i] <= 10^5
1 <= k <= nums.length
C++
class Solution {
public:
int numberOfSubarrays(vector<int>& nums, int k)
{
int n=nums.size();
vector<int> tmp;
for(int i=0;i<n;i++)
{
if(1==nums[i]%2)
{
tmp.push_back(i);
}
}
if(tmp.size()<k)
{
return 0;
}
int res=0;
for(int i=0;i<=tmp.size()-k;i++)
{
int idx1=tmp[i];
int idx2=tmp[i+k-1];
int left;
int right;
if(0==i)
{
left=idx1+1;
}
else
{
left=tmp[i]-tmp[i-1];
}
if(i+k-1==tmp.size()-1)
{
right=n-1-idx2+1;
}
else
{
right=tmp[i+k]-tmp[i+k-1];
}
res+=left*right;
}
return res;
}
};