【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/

相关推荐
肆悟先生2 分钟前
3.15 引用类型
c++·算法
暗之星瞳8 分钟前
随机森林(初步学习)
算法·随机森林·机器学习
不爱吃糖的程序媛10 分钟前
基于Ascend C开发的Vector算子模板库-ATVOSS 技术深度解读
人工智能·算法·机器学习
松涛和鸣10 分钟前
35、Linux IPC进阶:信号与System V共享内存
linux·运维·服务器·数据库·算法·list
Cx330❀16 分钟前
《C++ 动态规划》第001-002题:第N个泰波拉契数,三步问题
开发语言·c++·算法·动态规划
LYFlied16 分钟前
【每日算法】LeetCode 114. 二叉树展开为链表:从树结构到线性结构的优雅转换
数据结构·算法·leetcode·链表·面试·职场和发展
毕设源码-钟学长21 分钟前
【开题答辩全过程】以 基于Spark机器学习算法的体育新闻智能分类系统设计与实现为例,包含答辩的问题和答案
算法·机器学习·spark
天勤量化大唯粉24 分钟前
基于距离的配对交易策略:捕捉价差异常偏离的均值回归机会(天勤量化代码实现)
android·开发语言·python·算法·kotlin·开源软件·策略模式
智航GIS25 分钟前
ArcGIS大师之路500技---036通俗易懂讲解克里金法
人工智能·算法·arcgis
拼好饭和她皆失27 分钟前
逆元,除法同余原理
算法·逆元·除法同余原理