方法一:
class Solution:
def numberOfSubarrays(self, nums: List[int], k: int) -> int:
res, cnt, idx = 0, 0, [-1]
for i, num in enumerate(nums):
cnt += num % 2
if cnt >= len(idx):
idx.append(i)
if cnt >= k:
res += idx[cnt - k + 1] - idx[cnt - k]
return res
class Solution:
def numberOfSubarrays(self, nums: List[int], k: int) -> int:
n = len(nums)
odd = [-1]
ans = 0
for i in range(n):
if nums[i] % 2 == 1:
odd.append(i)
odd.append(n)
for i in range(1, len(odd) - k):
ans += (odd[i] - odd[i - 1]) * (odd[i + k] - odd[i + k - 1])
return ans
方法二:前缀和+差分
class Solution:
def numberOfSubarrays(self, nums: List[int], k: int) -> int:
cnt = [0] * (len(nums) + 1)
cnt[0] = 1
odd, ans = 0, 0
for num in nums:
if num % 2 == 1:
odd += 1
if odd >= k:
ans += cnt[odd - k]
cnt[odd] += 1
return ans```