解题思路
一、滑动窗口
不断右移 right 指针来扩大滑动窗口,使其包含 k 个奇数;
若当前滑动窗口包含了 k 个奇数,则如下「计算当前窗口的优美子数组个数」:
统计第 1 个奇数左边的偶数个数 leftEvenCnt。 这 leftEvenCnt 个偶数都可以作为「优美子数组」的起点,因此起点的选择有 leftEvenCnt + 1 种(因为可以一个偶数都不取,因此别忘了 +1 )。
统计第 k 个奇数右边的偶数个数 rightEvenCnt 。 这 rightEvenCnt 个偶数都可以作为「优美子数组」的终点,因此终点的选择有 rightEvenCnt + 1 种(因为可以一个偶数都不取,因此别忘了 +1 )。
因此「优美子数组」左右起点的选择组合数为 (leftEvenCnt + 1) * (rightEvenCnt + 1)。
python
class Solution:
def numberOfSubarrays(self, nums: List[int], k: int) -> int:
left = right = odd_cnt = res = 0
while right < len(nums):
if nums[right] % 2 == 1:
odd_cnt += 1
if odd_cnt == k:
tmp = right
while right < len(nums) and nums[right] % 2 == 0:
right += 1
right_even_cnt = right - tmp
left_even_cnt = 0
while left < len(nums) and nums[left] % 2 == 0:
left_even_cnt += 1
left += 1
res += (left_even_cnt + 1) * (right_even_cnt + 1)
left += 1
odd_cnt -= 1
right += 1
return res