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

【Leetcode 每日一题】2962. 统计最大元素出现至少 K 次的子数组

问题背景

给你一个整数数组 n u m s nums nums 和一个 正整数 k k k
请你统计有多少满足 「 n u m s nums nums 中的 最大 元素」至少出现 k k k 次的子数组,并返回满足这一条件的子数组的数目。
子数组是数组中的一个连续元素序列。

数据约束

  • 1 ≤ n u m s . l e n g t h ≤ 1 0 5 1 \le nums.length \le 10 ^ 5 1nums.length105
  • 1 ≤ n u m s [ i ] ≤ 1 0 6 1 \le nums[i] \le 10 ^ 6 1nums[i]106
  • 1 ≤ k ≤ 1 0 5 1 \le k \le 10 ^ 5 1k105

解题过程

子数组长度越大,最大元素出现次数越有可能满足条件,适用滑窗。
累计答案时有两种思路,在内层循环中,可以固定左端点,当前右端点直到数组末尾都是合法的答案,共有 ( n − r i g h t ) (n - right) (nright) 个;在内层循环结束时,可以固定右端点,数组开头直到当前左端点都是合法的答案,共有 l e f t left left 个。

具体实现

class Solution {public long countSubarrays(int[] nums, int k) {long res = 0;int target = 0;for (int num : nums) {target = Math.max(target, num);}int count = 0;for (int left = 0, right = 0; right < nums.length; right++) {if (nums[right] == target) {count++;}while (count >= k) {if (nums[left] == target) {count--;}                left++;// 在内层循环中统计答案,固定左端点得到的所有子数组都是符合条件的res += n - right;}// 在内层循环结束时统计答案,固定右端点得到的所有子数组都是符合条件的// res += left;}return res;}
}
http://www.xdnf.cn/news/3071.html

相关文章:

  • 如何对多维样本进行KS检验
  • UNIAPP项目记录
  • 【大厂实战】API网关进化史:从统一入口到智能AB分流,如何构建灰度无感知系统?
  • 【工具变量】上市公司30w+过度负债数据集(2004-2023年)
  • 【嘉立创EDA】如何无限制挖槽,快捷设计挖槽
  • Linux系统配置JDK
  • 哈工大《工程伦理》复习文档
  • 存储过程补充——定义条件、处理程序及游标使用
  • PID速度、电流、位置闭环
  • swagger2升级至openapi3的利器--swagger2openapi
  • Linux 用户管理
  • 数据处理方式 之 对数变换 和Box-Cox变换以及对应逆变换【深度学习】
  • JavaScript基础
  • 使用C# ASP.NET创建一个可以由服务端推送信息至客户端的WEB应用(1)
  • Qwen3术语解密
  • 【SAM2代码解析】数据集处理2
  • go打印金字塔
  • 探索行业的新可能 - 你有遇到这些挑战吗?
  • 创新应用 | 食堂餐牌显示的“秒变”革新
  • Python深度挖掘:openpyxl和pandas的使用详细
  • 优雅的酸碱中和反应动画演示工具
  • 仿腾讯会议——注册登录UI
  • docker 使用
  • 数据采集脱硫脱硝除尘实验装置
  • DTO,VO,PO,Entity
  • 第一个机器人程序
  • C语言教程(二十):C 语言 typedef 关键字详解
  • AVL树左旋右旋的实现
  • C语言加餐--浮点数比较
  • 文件基础-----C语言经典题目(10)