题目:
给你一个整数数组 nums 和一个整数 k。
如果某个 连续 子数组中恰好有 k 个奇数数字,我们就认为这个子数组是「优美子数组」。
请返回这个数组中「优美子数组」的数目。
示例 1:
输入:nums = [1,1,2,1,1], k = 3
输出:2
解释:包含 3 个奇数的子数组是 [1,1,2,1] 和 [1,2,1,1] 。
示例 2:
输入:nums = [2,4,6], k = 1
输出:0
解释:数列中不包含任何奇数,所以不存在优美子数组。
示例 3:
输入:nums = [2,2,2,1,2,2,1,2,2,2], k = 2
输出:16
提示:
1 <= nums.length <= 50000
1 <= nums[i] <= 10^5
1 <= k <= nums.length
题目的理解:
从数组中连续的获取一个子数组,此子数组包含k个奇数,则是「优美子数组」。
- 获取所有的奇数位置,保存到数组A中。
- 遍历数组A,并按k长度进行处理数组。
- 获取k长度的奇数位置数B,B左边到左边另一个奇数之间的偶数数目left,B右边到右边另一个奇数之间的偶数数组right。
- 则此B能够获取「优美子数组」S = left * right + 1 + left + right
- 遍历A中的所有k长度得到S的总和。
python实现
from typing import List
class Solution:
def numberOfSubarrays(self, nums: List[int], k: int) -> int:
oddIndexs = list()
for index, num in enumerate(nums):
if num % 2 != 0:
oddIndexs.append(index)
result = 0
for index, oddIndex in enumerate(oddIndexs):
if index + k > len(oddIndexs):
break
if index - 1 >= 0:
left = oddIndex - oddIndexs[index - 1] - 1
else:
left = oddIndex
if index + k < len(oddIndexs):
right = oddIndexs[index + k] - oddIndexs[index + k - 1] - 1
else:
right = len(nums) - oddIndexs[index + k - 1] - 1
result += left * right + 1 + left + right
return result
想看最优解法移步此处
提交
多读书// END 如果突然发现自己书读的少,是不是说明我对自己的要求越来越高了
网友评论