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

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

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 <= nums.length <= 105
1 <= nums[i] <= 106
1 <= k <= 105

题解

如标题所示,本题采用滑动数组进行解题

题目要求所有满足条件的子数组
那么我们自然需要考虑所有的子数组
我们该如何做到呢

首先看看如何枚举所有的子数组
我们可以用一个循环枚举出所有子数组可能的开头,然后内层再写一个循环枚举所有可能的结尾,这样就枚举了所有的子数组

那么滑动数组又该如何考虑到所有的子数组呢?


类似的,我们可以写一个循环枚举出所有子数组的结尾 i
然后使用指针 l=0 作为子数组的开头,那么 l 与 i 就是滑动窗口的区间
我们使用变量 count 记录滑动窗口中的最大值的个数,res=0 记录返回值
此时 i 作为窗口的右边不断右移
当 count == k 时,此时的滑动窗口满足条件,我们找到了一个答案

但是问题是,接下来我们要如移动滑动窗口呢?
将 i 向右移,还是将 l 向右移

注意到,我们第一层循环是枚举所有子数组的结尾
只要对于每一种结尾,我们都找到所有可能的子数组就能解决问题
但是我们显然不能枚举开头 l ,否则与枚举就一样了,时间复杂高
当 count == k 时,我们可以将 窗口左边 l 右移,直到 count != k
那么对于此时的 i ,此时所有以 l 的左边为开头的子数组 [ l, i ] 都是满足条件的
也就是我们找到了以 i 结尾的所有满足条件的子数组
所以滑动窗口 [ l, i ] 的含义就是以 i 结尾的,第一个不满足条件的子数组
res+=l ,枚举下一个 i
如果 count != k,那么 l 的位置不变,res+=l
如果count==k,那么接着移动 l 直到滑动窗口不满足条件

总计滑动窗口划过一次数组,时间复杂度为 O(n)


代码如下↓

long long countSubarrays(int* nums, int numsSize, int k) {
    int l=0;
    int max=0;
    long res=0;
    int count=0;
    for(int i=0;i<numsSize;i++)
    {
        if(nums[i]>max)
        {
            max=nums[i];
        }
    }
    for(int i=0;i<numsSize;i++)
    {
        if(nums[i]==max)
        {
            count++;
        }
        while(count==k)//怎么说呢,每次i就是子数组的右端点,每次当count的个数为k的时候,就将l右移,直到count<k,那么l之前的所有字符都可以作为子数组的左端点,也就是说以i为右端点的满足条件的子数组有left个。然后i继续右移,直到count再次==k,然后重复以上过程,left左边的所有字符同样满足条件,count的个数肯定>=k,所以res+=left
        {
            if(nums[l]==max)
            {
                count--;
            }
            l++;
        }
        res+=l;
        printf("%d\n",l);
    }
    return res;
}

相关文章:

  • C++ —— 线程安全
  • 神经网络的数据集处理
  • vxe-table中vxe-grid中的合并单元格(合并行、列)
  • 音视频入门基础:RTP专题(17)——音频的SDP媒体描述
  • 主流向量数据库对比
  • ubuntu 24 安装 python3.x 教程
  • 深度学习篇---Opencv中Haar级联分类器的自定义
  • 怎样进行相关论文的调研——How to conduct research on relevant papers?
  • WebSocket 使用教程
  • C# net deepseek RAG AI开发 全流程 介绍
  • 大数据学习(66)- CDH管理平台
  • 爬虫一些基础知识的备忘录(需要自取)
  • 大语言模型微调和大语言模型应用的区别?
  • Python中将Markdown文件转换为Word
  • hadoop案例实践:气象大数据离线分析
  • 悬挂指针与野指针:如何避免常见内存问题
  • MySql学习_基础Sql语句
  • WSL 中的高级设置配置
  • kkFileView文件预览组件部署说明
  • 工控hmi医疗终端机的界面如何来设计?本文为你解答
  • 手机号旧机主信用卡欠款、新机主被催收骚扰四年,光大银行济南分行回应
  • 迎接神十九乘组回家,东风着陆场各项工作已准备就绪
  • 美银证券前董事总经理胡霁光履新,任摩根士丹利中国区副主席
  • 政治局会议:优化存量商品房收购政策,持续巩固房地产市场稳定态势
  • 中共中央政治局召开会议,分析研究当前经济形势和经济工作,中共中央总书记习近平主持会议
  • “网红”谭媛去世三年:未停更的账号和困境中的家庭