classSolution { public: intnumberOfSubarrays(vector<int>& nums, int k){ int n=nums.size(); vector<int> v; for(int i=0;i<n;i++) { if(nums[i]%2) v.push_back(i); } if(v.size()<k) return0; int size=v.size(),res=0; for(int i=0;i<size-k+1;i++) { int j=i+k-1; int l=i==0?v[i]+1:v[i]-v[i-1]; int r=j==(size-1)?(n-v[j]):(v[j+1]-v[j]); res+=l*r; } return res; } };
解法2:前缀数组
参考二哥的思路
思路:前缀和,把数组中所有奇数都变成 1,所有偶数变成 0,于是原数组中区间中奇数的个数就等于变换后数组中区间和用一个 map 统计前缀和等于 s 的个数,就可以统计区间和等于 k 的个数了。
sum[s]表示第s个奇数与第s+1个奇数间的距离
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
classSolution { public: intnumberOfSubarrays(vector<int>& nums, int k){ int s = 0; map<int,int> sum; sum[s] ++; int ret = 0; for (int i = 0;i < nums.size();i++) { if (nums[i] % 2 == 1) { s++; } if (s - k >= 0) { ret += sum[s - k]; } sum[s]++; } return ret; } };