当前位置: 首页 > news >正文

LeetCode 分类刷题:2962. 统计最大元素出现至少 K 次的子数组

题目

给你一个整数数组 nums 和一个 正整数 k 。

请你统计有多少满足 「 nums 中的 最大 元素」至少出现 k 次的子数组,并返回满足这一条件的子数组的数目。

子数组是数组中的一个连续元素序列。

示例 1:

输入:nums = [1,3,2,3,3], k = 2
输出:6
解释:包含元素 3 至少 2 次的子数组为:[1,3,2,3]、[1,3,2,3,3]、[3,2,3]、[3,2,3,3]、[2,3,3] 和 [3,3] 。

示例 2:

输入:nums = [1,4,2,1], k = 3
输出:0
解释:没有子数组包含元素 4 至少 3 次。

解析

由于子数组越长,包含的元素越多,越能满足题目要求;反之,子数组越短,包含的元素越少,越不能满足题目要求。有这种性质的题目,可以用滑动窗口解决。

  1. 设 mx=max(nums)。
  2. 元素 x=nums[right] 进入窗口时,如果 x=mx,把计数器 cntMx 加一。
  3. 如果 cntMx=k,则不断右移左指针 left,直到窗口中的 mx 的出现次数小于 k 为止。
  4. 内层循环结束后,[left,right] 这个子数组是不满足题目要求的,但在退出循环之前的最后一轮循环,[left−1,right] 是满足题目要求的。由于子数组越长,越能满足题目要求,所以除了 [left−1,right],还有 [left−2,right],[left−3,right],…,[0,right] 都是满足要求的。也就是说,当右端点固定在 right 时,左端点在 0,1,2,…,left−1 的所有子数组都是满足要求的,这一共有 left 个,加到答案中。

作者:灵茶山艾府
链接:https://leetcode.cn/problems/count-subarrays-where-max-element-appears-at-least-k-times/solutions/2560940/hua-dong-chuang-kou-fu-ti-dan-pythonjava-xvwg/
来源:力扣(LeetCode)

答案

这里我自己AC的写法和灵神的有一点不一样,分别如下:

自己的写法:

class Solution:def countSubarrays(self, nums: List[int], k: int) -> int:m = max(nums)n = len(nums)if k > n:return 0left = 0ans = 0count = 0for right, x in enumerate(nums):    # 移动右指针,扩大窗口if x == m:count += 1    # 更新最大元素出现次数while count == k:    # 满足最大元素出现k次时ans += n - right    # 从[left...right]到[left...n-1]这些子数组都满足if nums[left] == m:    # 如果左端点元素等于最大元素count -= 1    # 移动左指针前,将最大元素出现次数减1left += 1    # 移动左指针,缩小窗口return ans

灵神的写法:

class Solution:def countSubarrays(self, nums: List[int], k: int) -> int:m = max(nums)n = len(nums)if k > n:return 0left = 0ans = 0count = 0for right, x in enumerate(nums):    # 移动右指针,扩大窗口if x == m:count += 1while count == k:    # 满足最大元素出现k次时,持续移动左指针if nums[left] == m:    # 如果左端点元素等于最大元素count -= 1    # 移动左指针前,将最大元素出现次数减1left += 1ans += left    # 从[0...right]到[left-1...right]都满足return ans

复杂度分析

时间复杂度:O(n),其中 n 为 nums 的长度。虽然写了个二重循环,但是内层循环中对 left 加一的总执行次数不会超过 n 次,所以总的时间复杂度为 O(n)。
空间复杂度:O(1)。

作者:灵茶山艾府
链接:https://leetcode.cn/problems/count-subarrays-where-max-element-appears-at-least-k-times/solutions/2560940/hua-dong-chuang-kou-fu-ti-dan-pythonjava-xvwg/
来源:力扣(LeetCode)

http://www.xdnf.cn/news/1315675.html

相关文章:

  • 零墨云A4mini打印机设置电脑通过局域网络进行打印
  • 详解flink java基础(一)
  • Flink作业执行的第一步:DataFlow graph的构建
  • nodejs 错误处理
  • Gradle快速入门学习
  • 数据结构初阶(19)外排序·文件归并排序的实现
  • 机器学习案例——对好评和差评进行预测
  • error #include<cuda_runtime_api.h>解决方案
  • Java基础 8.17
  • 2023年全国研究生数学建模竞赛华为杯F题强对流降水临近预报求解全过程文档及程序
  • RAG 分块中表格填补简明示例:Markdown、HTML、Excel、Doc
  • 机器学习--数据清洗
  • 北京JAVA基础面试30天打卡12
  • STM32CUBEMX配置stm32工程
  • 五、redis入门 之 客户端连接redis
  • Go语言并发编程 ------ 临界区
  • 批次号规则
  • Mac(四)自定义按键工具 Hammerspoon 的安装和使用
  • FX10/20 (CYUSB401X)开发笔记5 固件架构
  • 基于DSP+ARM+FPGA架构的储能协调控制器解决方案,支持全国产化
  • 【完整源码+数据集+部署教程】无人机航拍视角洪水检测与受灾房屋识别图像分割救援指导系统源码和数据集:改进yolo11-DCNV2
  • Tomcat下载、安装及配置详细教程
  • STL 容器
  • Kotlin集合概述
  • 第16节:自定义几何体 - 从顶点构建3D世界
  • 【MySQL学习|黑马笔记|Day7】触发器和锁(全局锁、表级锁、行级锁、)
  • 《Python学习之文件操作:从入门到精通》
  • Linux 服务:iSCSI 存储服务配置全流程指南
  • Java基础面试题(3)—Java(String字符串的存储方式,字面量)
  • 链表OJ题讲解---试金石含金量