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 <= 500001 <= nums[i] <= 10^51 <= k <= nums.length
Approach 01:
-
C++
-
Python
#include <vector>
class Solution {
public:
int numberOfSubarrays(std::vector<int>& nums, int k) {
return atMost(nums, k) - atMost(nums, k - 1);
}
private:
int atMost(const std::vector<int>& nums, int k) {
int count = 0;
int left = 0;
int odd_count = 0;
for (int right = 0; right < nums.size(); ++right) {
if (nums[right] % 2 == 1) {
odd_count++;
}
while (odd_count > k) {
if (nums[left] % 2 == 1) {
odd_count--;
}
left++;
}
count += right - left + 1;
}
return count;
}
};
from typing import List
class Solution:
def numberOfSubarrays(self, nums: List[int], k: int) -> int:
def atMost(k: int) -> int:
count = 0
i = 0
odd_count = 0
for j in range(len(nums)):
if nums[j] % 2 == 1:
odd_count += 1
while odd_count > k:
if nums[i] % 2 == 1:
odd_count -= 1
i += 1
count += j - i + 1
return count
# Number of subarrays with exactly k odd numbers
return atMost(k) - atMost(k - 1)
Time Complexity Analysis
- Function
atMost:- The outer loop iterates over each element of the
numsarray exactly once. - The inner while loop ensures that each element is processed at most once by both the
leftandrightpointers.
- The outer loop iterates over each element of the
Therefore, the time complexity of the atMost function is O(n), where nnn is the length of the nums array.
- Overall Complexity:
- The
numberOfSubarraysfunction calls theatMostfunction twice, resulting in a total time complexity of O(n)+O(n)=O(n).
- The
Space Complexity
The space complexity is O(1) since we use a fixed amount of extra space.