题目描述
解法一:排列组合(C++)
这个想法很简单,先一次遍历找出所有奇数的位置,然后一头一尾采用排列组合
详细参考 官方题解
class Solution {
public:
int numberOfSubarrays(vector<int>& nums, int k) {
int n = (int)nums.size();
int odd[n+2], ans = 0, cnt = 0;
for(int i=0;i<n;i++)
if(nums[i]&1) odd[++cnt] = i;
odd[0] = -1, odd[++cnt] = n;
for(int i=1;i+k<=cnt;i++)
ans += (odd[i]-odd[i-1])*(odd[i+k]-odd[i+k-1]);
return ans;
}
};
解法二:(C++)
详细参考 官方题解
class Solution {
public:
int numberOfSubarrays(vector<int>& nums, int k) {
int n = (int)nums.size();
vector<int> cnt(n+1, 0);
int odd = 0, ans = 0;
cnt[0] = 1;
for(int i=0;i<n;i++)
{
odd += nums[i]&1;
ans += odd>=k?cnt[odd-k]:0;
cnt[odd] += 1;
}
return ans;
}
};