LeetCode1248. 统计「优美子数组」

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


            
        
                
已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 酷酷鲨 设计师:CSDN官方博客 返回首页