【leetcode--统计优美子数组】

解题思路

一、滑动窗口

不断右移 right 指针来扩大滑动窗口,使其包含 k 个奇数;

若当前滑动窗口包含了 k 个奇数,则如下「计算当前窗口的优美子数组个数」:

统计第 1 个奇数左边的偶数个数 leftEvenCnt。 这 leftEvenCnt 个偶数都可以作为「优美子数组」的起点,因此起点的选择有 leftEvenCnt + 1 种(因为可以一个偶数都不取,因此别忘了 +1 )。

统计第 k 个奇数右边的偶数个数 rightEvenCnt 。 这 rightEvenCnt 个偶数都可以作为「优美子数组」的终点,因此终点的选择有 rightEvenCnt + 1 种(因为可以一个偶数都不取,因此别忘了 +1 )。

因此「优美子数组」左右起点的选择组合数为 (leftEvenCnt + 1) * (rightEvenCnt + 1)。

python 复制代码
class Solution:  
    def numberOfSubarrays(self, nums: List[int], k: int) -> int:  
        left = right = odd_cnt = res = 0  
        while right < len(nums):  
            if nums[right] % 2 == 1:  
                odd_cnt += 1  
            if odd_cnt == k:  
                tmp = right  
                while right < len(nums) and nums[right] % 2 == 0:  
                    right += 1  
                right_even_cnt = right - tmp  
                left_even_cnt = 0  
                while left < len(nums) and nums[left] % 2 == 0:  
                    left_even_cnt += 1  
                    left += 1   
                res += (left_even_cnt + 1) * (right_even_cnt + 1)  
                left += 1  
                odd_cnt -= 1  
            right += 1  
        return res  

参考链接:https://leetcode.cn/problems/count-number-of-nice-subarrays/solutions/213352/hua-dong-chuang-kou-qian-zhui-he-bi-xu-miao-dong-b/

相关推荐
CS创新实验室9 小时前
算法、齿轮与硅基大脑:数值计算发展简史
人工智能·算法·数值计算
海石10 小时前
1563分的简单题,可能就简单在能被暴力AC
算法·leetcode
海石11 小时前
1400分的dp汗流浃背之【交替子数组计数】
算法·leetcode
奋发向前wcx11 小时前
P2590 树的统计 题目解析
数据结构·算法·深度优先
imbackneverdie12 小时前
AI4S不止于分子药物:以MedPeer为代表的科研基建打开产业新增量
大数据·人工智能·算法·aigc·科研·学术·ai 4s
额鹅恶饿呃13 小时前
C语言中的数据结构和变量
c语言·数据结构·算法
运行时记录14 小时前
prompt-optimizer skill
算法
万法若空14 小时前
【数据结构-哈希表】哈希表原理
数据结构·算法·散列表
退休倒计时14 小时前
【每日一题】LeetCode 437. 路径总和 III TypeScript
算法·leetcode·typescript
学逆向的15 小时前
汇编——内存
开发语言·汇编·算法·网络安全