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

LeetCode 2906 统计最大元素出现至少K次的子数组(滑动窗口)

给出一个示例:

输入: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] 。

该题也是一个比较简单的滑动窗口的题目,但是奈何我把题目看错了,导致一直想不到好的解决的方法,我把该题的【nums中的最大元素】省略掉了,看成了该数组中存在子数组的任意一个数只要有数量大于等于k的子数组有多少个。

所以理所应到的想到了用前缀和加滑动窗口,构造一个二维前缀和去统计每个值的出现次数,再通过遍历后的右边界减前边界得到,该区间的所有值的个数,如果有大于等于k的就记一次

class Solution {public long countSubarrays(int[] nums, int k) {int n = nums.length;int mx = Integer.MIN_VALUE;for(int num:nums){mx = Math.max(mx,num);}int[][] ans = new int[n+1][mx+1];for(int i=1;i<n+1;i++){ans[i][nums[i-1]]++;}int number = 0;for(int i=2;i<n+1;i++){int left = i-k;int right = i;for(int j=1;j<=mx;j++){if(ans[right][j]-ans[left][j]>=k) number++;}}return number;}
}

但代码本身还是存在问题且复杂度过高,很可能通过不了,爆超时等等。反应过来后,再重新理清了一遍思路和题目,才发现就是一个简单的滑动窗口,还是那句话,外循环右扩展,内循环左收缩。

class Solution {public long countSubarrays(int[] nums, int k) {int max = Integer.MIN_VALUE;for (int num : nums) {max = Math.max(max, num);}long res = 0;int count = 0;int left = 0;for (int right = 0; right < nums.length; right++) {if (nums[right] == max) {count++;}while (count >= k) {// 当前窗口满足条件,从 right 到数组末尾的所有子数组都满足res += nums.length - right;if (nums[left] == max) {count--;}left++;}}return res;}
}

错误代码就不解释了,解释一下我的正确代码。

先通过遍历找到最大值mx

然后开始滑动窗口,拿[1,3,2,3,3] k=2举例吧

先遍历右边界,使得mx值的数量大于等于k 得到对应的r=3坐标,当前子数组记作[1,3,2,3][1,3,2,3,3]

然后通过内循环遍历左边界,每遍历一次,只要还能进入内循环就说明子数组符合要求记res+=nums.length - right 那为什么是nums.length - right呢,其实就是上面记作的子数组的数目,当left++后去除了子数组的1,子数组成为了[3,2,3][3,2,3,3]

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

相关文章:

  • 软件测试基础知识详解
  • 【AI面试准备】负责所有Al产品的模型能力评估及测试,保障AI产品的质量
  • AI Agent Protocols:现状、挑战与未来展望
  • 使用VS2022开发并部署QT应用
  • Karmada 多 Kubernetes集群管理实战
  • 如何查看和验证AWS CloudFront的托管区域ID
  • unity在编辑器模式调试音频卡顿电流声
  • 什么是向量库和数据向量化?建设向量库有什么作用?
  • vue.js中的一些事件修饰符【前端】
  • Pytest中的fixture装饰器详解
  • OpenCV 图形API(72)图像与通道拼接函数-----根据指定的方式翻转图像(GMat)函数 flip()
  • 布局元素组件 (Layout Element)
  • 功放IC搭配的升压芯片选型指南:为何FP5207更适合高保真功放系统?
  • 基于大模型的大肠息肉全程管理研究报告
  • 东土科技NewPre系列智能控制器的创新之旅
  • 第17节:传统分类模型-随机森林与决策树
  • 【Prometheus-Mongodb Exporter安装配置指南,开机自启】
  • 【安全扫描器原理】ICMP扫描
  • Docker基础(安装和命令)
  • 第三节:用户和用户组管理
  • 测试——BUG篇
  • python类中的 __contains__方法是什么?
  • unity Orbbec Femto Bolt接入unity流程记录 AzureKinectExamples 插件 使用记录
  • oracle 批量查询每张表的数据量
  • RoPE 相对位置编码 VS 传统位置编码
  • neo4j vs python
  • Canal使用
  • 巧记英语四级单词 Unit7-上【晓艳老师版】
  • 【应用密码学】实验三 流密码(ZUC)
  • 智能电子白板的设计与实现:从硬件选型到软件编程