1248. Count Number of Nice Subarrays
Given an array of integers nums and an integer k. A continuous 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 are 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 <= numsi <= 10^5
- 1 <= k <= nums.length
From: LeetCode
Link: 1248. Count Number of Nice Subarrays
Solution:
Ideas:
count subarrays with exactly k odds = subarrays with at most k odds − subarrays with at most k-1 odds.
Code:
c
int atMostKOdds(int* nums, int numsSize, int k) {
if (k < 0) return 0;
int left = 0;
int countOdd = 0;
int ans = 0;
for (int right = 0; right < numsSize; right++) {
if (nums[right] % 2 == 1) {
countOdd++;
}
while (countOdd > k) {
if (nums[left] % 2 == 1) {
countOdd--;
}
left++;
}
ans += right - left + 1;
}
return ans;
}
int numberOfSubarrays(int* nums, int numsSize, int k) {
return atMostKOdds(nums, numsSize, k) - atMostKOdds(nums, numsSize, k - 1);
}