1. 题目
给你一个整数数组 nums 和一个整数 k。
如果某个 连续 子数组中恰好有 k 个奇数数字,我们就认为这个子数组是「优美子数组」。
请返回这个数组中「优美子数组」的数目。
示例 1:
输入:nums = [1,1,2,1,1], k = 3
输出:2
解释:包含 3 个奇数的子数组是 [1,1,2,1] 和 [1,2,1,1] 。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/count-number-of-nice-subarrays
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2. 解题思路
这是一道排列计算问题,统计两两奇数区间含有的偶数个数。
当奇数个数满足时,它可以拓展的个数为左侧奇数含有偶数个数*右侧奇数含有偶数个数。
class Solution:
def numberOfSubarrays(self, nums: List[int], k: int) -> int:
#count_odd 字典型,键为累加的奇数的个数,值为当前奇数左边含有偶数的个数
#count_odd_right 字典型,键为累加奇数的个数,值为奇数右端含有偶数的个数
count_odd = {}
even = 0
odd = 0
lasteven = 0
for item in nums:
if item % 2 == 0:
even += 1
else:
odd += 1
count_odd[odd] = even - lasteven
lasteven = even
count_odd_right = {}
even = 0
lasteven = 0
for i in range(len(nums)-1,-1,-1):
if nums[i] % 2 == 0:
even += 1
else:
count_odd_right[odd] = even - lasteven
lasteven = even
odd -= 1
res = 0
for i in sorted(count_odd.keys()):
left = count_odd[i] + 1
right = count_odd_right.get(i+k-1,-1) + 1
res += left*right
return res