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

Leetcode-​2537. 统计好子数组的数目​

Problem: 2537. 统计好子数组的数目

思路

滑动窗口

解题过程

思路:

使用滑动窗口来维护子数组,并通过组合计数动态调整满足条件的数对数目。具体来说,我们维护一个窗口[l,r],使得窗口内相同元素的对数至少为 k,并计算这样的窗口数目。

关键观察:

  • 当一个元素的频次从 c 增加到 c+1 时,新增加的数对数目为 c(因为新元素可以与之前的 c 个元素形成 c 对)。
    • 当一个元素的频次从 c 减少到 c-1 时,减少的数对数目为 c-1(因为移除的元素与剩余的 c-1 个元素的数对被移除)。

      算法步骤:

      • 使用两个指针 l 和 r 维护滑动窗口,使用哈希表 cnt 记录元素频次,使用变量 t 记录窗口内的数对数目。
        • 右指针 r 不断扩展窗口,更新元素频次和数对数目 t。
          • 当 t >= k 时,尝试移动左指针 l 缩小窗口,同时更新数对数目 t,直到窗口不再满足条件。
            • 此时,以 r 结尾且满足条件的子数组数目为 l(即左端点可以是 0 到 l-1 的任意位置)。

            Code

            python

            class Solution:def countGood(self, nums: List[int], k: int) -> int:n = len(nums)ans = 0l = 0cnt = defaultdict(int)  # 记录数组中的元素频次t = 0  # 记录此时窗口的满足i<j且nums[i]=nums[j]的对数for r, x in enumerate(nums):cnt[x] += 1if cnt[x] >= 2:t += cnt[x] - 1while t >= k and l < r:cnt[nums[l]] -= 1if cnt[nums[l]] >= 1:t -= cnt[nums[l]]l += 1ans += lreturn ans

            c++

            class Solution {
            public:long long countGood(vector<int>& nums, int k) {int n = nums.size();long long ans = 0;int l = 0;unordered_map<int, int> cnt;int t = 0;for (int r = 0; r < n; r++) {cnt[nums[r]]++;if (cnt[nums[r]] >= 2)t += cnt[nums[r]] - 1;while (t >= k && l < r) {cnt[nums[l]]--;if (cnt[nums[l]] >= 1)t -= cnt[nums[l]];l++;}ans += l;}return ans;}
            };

            复杂度

            • 时间复杂度: O(n)
            • 空间复杂度: O(n),用哈希表存储元素频次。
              http://www.lryc.cn/news/571421.html

              相关文章:

            • SALMONN-omni论文阅读
            • Datawhale YOLO Master 第1次笔记
            • 利用Enigma Virtual Box将QT生成的软件打包成一个exe可执行文件
            • 第100+42步 ChatGPT学习:R语言实现阈值调整
            • uniapp + vite + ts出现红色波浪线,各种ts报错
            • LeetCode--33.搜索旋转排序数组
            • 探秘KingbaseES在线体验平台:技术盛宴还是虚有其表?
            • List、Queue、Deque、Stack常用方法总结
            • 论文笔记:Trajectory generation: a survey on methods and techniques
            • DELL R730XD服务器调整风扇转速
            • python+uniapp微信小程序的共享雨伞租赁系统
            • [特殊字符]华为总部参观预约|企业通道揭秘
            • MySQL 中 DISTINCT 去重的核心注意事项详解
            • MSPM0G3507学习笔记(二) 超便捷配置led与按键
            • ffmpeg webm 透明通道视频转成rgba图片
            • 基于最新豆包大模型1.6实现 ArXiv Paper Reading MCP与Agent构建
            • C++ map代码练习 1、2、priority_queue基础概念、对象创建、数据插入、获取堆顶、出队操作、大小操作,自定义结构、代码练习 1 2
            • 电机及驱动器的安全、性能和能效认证
            • 02 ( chrome 浏览器插件, 立马翻译), 搭建本地 api
            • c++学习-多态
            • MacOS上MySQL的安装以及使用
            • 【编译工具】CodeRider 2.0:驭码 CodeRider 2.0 产品功能分析
            • 【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(软件篇)(二)
            • RK 安卓10/11平台 HDMI-IN 调试
            • RAG轻松通-P1:分块
            • 爬虫技术:数据获取的利器与伦理边界
            • 输电线路电缆护层环流在线监测装置:原理、优势与应用解析
            • Elasticsearch/OpenSearch MCP Quickstart
            • 日本生活:日语语言学校-日语作文-沟通无国界(2):回忆深刻的生日
            • threejs webVR获取相机正前方向量