leetcode1248. 统计「优美子数组」

def numberOfSubarrays(self, nums, k):
        """
        :type nums: List[int]
        :type k: int
        :rtype: int
        """
        count = 0
        mp = dict()
        mp[0] = 1                       #字典统计前缀中有key个奇数的个数,有0个奇数的是1
        pre = 0
        for num in nums:
            pre += num%2                #pre代表前缀中奇数的个数
            if pre >= k:                #大于等于k的说明可以满足条件,这时计算i+1为结尾的符合条件的j个数pre[i+1]−pre[j]==k,j<=i
                count += mp[pre-k]      #也就是pre[j]==pre[i+1]−k,找奇数个数为j个的前缀的个数
            mp[pre] = mp.get(pre,0)+1   #更新字典中记录的值
        return count

也可以滑动窗口,常数空间复杂度
学习一下思想:恰好有 k 个奇数数字=最多有k个奇数数字-最多有k-1个奇数数字

def numberOfSubarrays(self, nums, k):
        """
        :type nums: List[int]
        :type k: int
        :rtype: int
        """
        def findmax(nums,k):
            count,l = 0,0
            res = 0
            for r in range(len(nums)):
                if nums[r]%2 == 1:
                    count += 1
                while count > k:
                    if nums[l] %2 == 1:
                        count -= 1
                    l += 1
                res += r-l+1
            return res
        return findmax(nums,k) - findmax(nums,k-1)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值