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

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]

相关文章:

  • oracle怎样通过固化较优执行计划来优化慢sql
  • ant design pro 项目发布遇到登录页访问404
  • 【免费下载】2012-2023年全国夜间灯光数据
  • 从遍历序列构造二叉树:前序+中序与中序+后序的递归解法详解
  • JavaScript面试问题
  • tbb parallel_for 使用
  • 颜色分类,不靠“调色盘”:双指针 VS 计数排序的正面PK
  • 【Linux】服务自启动设置的方式
  • LayerSkip: Enabling Early Exit Inference and Self-Speculative Decoding
  • Java之BigDecimal
  • Silvaco仿真中victory process的蒙特卡洛(Monte Carlo)离子注入
  • 深入理解 Linux 权限管理:从基础到进阶
  • 【GESP】C++三级练习 luogu-B2117 整理药名
  • (三十二)Android开发中AppCompatActivity和Activity之间的详细区别
  • 2025运维工程师面试题1(答案在后一张)
  • 企业的AI转型:生死时速的进化之路
  • 【题解-Acwing】870. 约数个数
  • k8s部署
  • 4.29【Q】paraCompute
  • python之数字类型的操作
  • “80后”杨占旭已任辽宁阜新市副市长,曾任辽宁石油化工大学副校长
  • 日趋活跃!2024年我国数据生产总量同比增长25%
  • 杭州银行一季度净赚超60亿增逾17%,增速较去年同期有所回落
  • 葛兰西:“生活就是抵抗”
  • 涨价应对关税变化是短期之策,跨境电商塑造新品牌开辟“新蓝海”
  • 伤者升至80人,伊朗港口爆炸源头或为“危险品和化学品仓库”