Given an array of integers nums
and an integer k
. A subarray is called nice if there are k
odd numbers on it.
Return the number of nice sub-arrays.
Example 1:
Input: nums = [1,1,2,1,1], k = 3
Output: 2
Explanation: The only sub-arrays with 3 odd numbers are [1,1,2,1] and [1,2,1,1].
Example 2:
Input: nums = [2,4,6], k = 1
Output: 0
Explanation: There is no odd numbers in the array.
Example 3:
Input: nums = [2,2,2,1,2,2,1,2,2,2], k = 2
Output: 16
Constraints:
-
1 <= nums.length <= 50000
-
1 <= nums[i] <= 10^5
-
1 <= k <= nums.length
题解:
存储每个奇数出现的位置,然后计算每k个奇数的左右非奇数个数,相乘即可。
class Solution {
public:
int numberOfSubarrays(vector<int>& nums, int k) {
int n = nums.size();
int res = 0;
vector<int> odd;
for (int i = 0; i < n; i++) {
if (nums[i] & 1 == 1) {
odd.push_back(i);
}
}
if (odd.size() == 0 || k > odd.size()) {
return 0;
}
for (int i = 0; i < odd.size() - k + 1; i++) {
int left = 0, right = 0;
if (i == 0) {
left = odd[i] + 1;
}
else {
left = odd[i] - odd[i - 1];
}
if (i + k < odd.size()) {
right = odd[i + k] - odd[i + k - 1];
}
else {
right = n - odd[i + k - 1];
}
res += left * right;
}
return res;
}
};