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

LeetCode每日一题4.29

2962. 统计最大元素出现至少 K 次的子数组

在这里插入图片描述

问题分析

输入:一个整数数组 nums 和一个正整数 k。
目标:找到所有子数组,使得该子数组中的最大元素至少出现 k 次,并返回这样的子数组的数量。

思考

  1. 找到数组中的最大值
    首先,我们需要找到数组 nums 中的最大值 mx。
  2. 统计 mx 的出现次数
    然后,我们遍历数组,统计 mx 的出现次数 cnt_mx。
  3. 使用滑动窗口技术
    为了高效地找到所有满足条件的子数组,我们可以使用滑动窗口技术:
    初始化:设置两个指针 left 和 right,分别表示窗口的左边界和右边界。同时,初始化 cnt_mx(窗口内 mx 的出现次数)和 ans(满足条件的子数组数量)。
    扩展窗口:遍历数组,每次将 right 指针向右移动一位,如果当前元素等于 mx,则 cnt_mx 加 1。
    收缩窗口:当 cnt_mx 达到 k 时,进入内部 while 循环,移动 left 指针,缩小窗口,直到 cnt_mx 小于 k。在每次移动 left 指针时,如果 nums[left] 等于 mx,则 cnt_mx 减 1。
    更新答案:每次迭代时,ans 增加 left 的值,表示以 right 为右端点且长度不小于 left 的子数组都满足条件。

代码

class Solution:def countSubarrays(self, nums: List[int], k: int) -> int:mx = max(nums)ans = cnt_mx = left = 0for x in nums:if x == mx:cnt_mx += 1while cnt_mx == k:if nums[left] == mx:cnt_mx -= 1left += 1ans += leftreturn ans

复杂度分析

时间复杂度
遍历数组:外层 for 循环遍历数组,时间复杂度为 O(n)。
滑动窗口:内层 while 循环在最坏情况下每个元素最多被访问两次(一次由 right,一次由 left),因此时间复杂度也为 O(n)。
综合上述分析,总的时间复杂度为 O(n)。
空间复杂度
额外空间:只使用了常数级的额外空间(mx、ans、cnt_mx、left 等变量),因此空间复杂度为 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)

相关文章:

  • 省科学技术奖申报答辩PPT设计制作美化
  • 信息检索系统的组成部分和基本架构
  • 4月29日日记
  • jenkins slave节点打包报错Failed to create a temp file on
  • AI国学智慧语录视频,条条视频10W+播放量
  • 数据处理方式 之 对数变换 和Box-Cox变换以及对应逆变换【深度学习】
  • Vue2+Vue3学习笔记
  • 什么是Amazon S3
  • 农村供水智能化远程监控解决方案
  • php学习笔记(全面且适合新手)
  • 接入层架构演变
  • Android ProcessState init
  • 初中九年级学生体测准考证照片采集软件使用说明
  • Keras模型保存、加载介绍
  • JavaScript函数声明大比拼
  • 文献阅读(三)基于干旱强度和恢复时间的生态系统恢复力评估|《Agricultural and Forest Meteorology》
  • 极狐GitLab 如何使用文件导出迁移项目和群组?
  • 前端设置三行文本省略号,失效为什么?
  • 二叉树知识点
  • Jetson Xavier NX EMMC版本刷机
  • 光明网评“泉州梦嘉商贸楼不到5年便成危楼”:监管是否尽职尽责?
  • 国际锐评:菲律宾“狐假虎威”把戏害的是谁?
  • 我国首部《人工智能气象应用服务办法》今天发布
  • 走访中广核风电基地:701台风机如何乘风化电,点亮3000万人绿色生活
  • 今年我国电影票房破250亿领跑全球,“电影+”带动文旅消费热潮
  • 伊朗港口爆炸已致40人死亡