统计「优美子数组」

作者: _阿南_ | 来源:发表于2020-04-21 10:40 被阅读0次

题目:

给你一个整数数组 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个奇数,则是「优美子数组」。

  1. 获取所有的奇数位置,保存到数组A中。
  2. 遍历数组A,并按k长度进行处理数组。
  3. 获取k长度的奇数位置数B,B左边到左边另一个奇数之间的偶数数目left,B右边到右边另一个奇数之间的偶数数组right。
  4. 则此B能够获取「优美子数组」S = left * right + 1 + left + right
  5. 遍历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 如果突然发现自己书读的少,是不是说明我对自己的要求越来越高了

相关文章

网友评论

    本文标题:统计「优美子数组」

    本文链接:https://www.haomeiwen.com/subject/jynyihtx.html