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


            
        
                
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

rosefunR

你的赞赏是我创作的动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值