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

leecode2962 统计最大元素出现至少K次的子数组

在这里插入图片描述

这个题型属于滑动窗口的题型,由于需要统计元素出现的次数,所以我们需要额外的数据结构map

我的思路

  1. 我首先找出了数组最大值

  2. 之后我对这个数组进行遍历,直到找到map.containsKey(max)&&map.get(max)>=k 此时我们对这个次数进行判断。

    1. 我最开始的判断是直接写一个循环,从0开始,直到遍历出来的max元素大于已经添加到map集合的max元素个数减去k的时候停止,但这种方式有个问题就是时间复杂夫很高,只通过了622/634个,后续这个优化想了好久也没想到怎么优化的,就先放弃了。直接看题解了

      public long countSubarrays(int[] nums, int k) {int max = 0;for (int x : nums) {max = Math.max(max, x);}int len = nums.length;int max=arr[len-1],count=0;Map<Integer,Integer> map = new HashMap<>();for(int right=0;right<len;right++){map.put(nums[right],map.getOrDefault(nums[right],0)+1);int left =0,count_temp=0;if(map.containsKey(max)&&map.get(max)>=k){while (count_temp<=map.get(max)-k){if(nums[left]==max){count_temp++;}left++;count++;}}}return count;
      }
      
    2. 优化思路,把这个循环计数,转化为计数一次。

      for(int right=0;right<len;right++){map.put(nums[right],map.getOrDefault(nums[right],0)+1);while(map.containsKey(max)&&map.get(max)==k){if(nums[left]==max){map.put(max,map.get(max)-1);}left++;}count+=left;
      }
      

灵神的思路

太强了,我太死板了,以为这种统计次数还是需要用map集合来做,但实际上,不需要,只需要一个计数器就行了,

class Solution {public long countSubarrays(int[] nums, int k) {int mx = 0;for (int x : nums) {mx = Math.max(mx, x);}long ans = 0;int cntMx = 0, left = 0;for (int x : nums) {if (x == mx) {cntMx++;}while (cntMx == k) {if (nums[left] == mx) {cntMx--;}left++;}ans += left;}return ans;}
}作者:灵茶山艾府
链接:https://leetcode.cn/problems/count-subarrays-where-max-element-appears-at-least-k-times/solutions/2560940/hua-dong-chuang-kou-fu-ti-dan-pythonjava-xvwg/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
http://www.dtcms.com/a/312520.html

相关文章:

  • 第12届蓝桥杯Scratch图形化【省赛】初级组 2021年4月24日
  • 从Docker衔接到导入黑马商城以及前端登录显示用户或密码错误的相关总结(个人理解,仅供参考)
  • 从传热学基础到有限元弱形式推导:拆解热传导问题Matlab有限元离散核心
  • C++ 信号处理
  • 【AI编程工具IDE/CLI/插件专栏】-国外IDE与Cursor能力对比
  • 【从零开始速通C语言1】 - 汇编语言1
  • 西门子PLC基础指令4:输出指令、立即输出指令
  • 信用衍生工具
  • 《基于特征融合的小目标检测方法及其在医学影像领域的应用研究》论文解析
  • Coin Combinations I(Dynamic Programming)
  • ThinkPHP 与 Vue.js 结合的全栈开发模式
  • 多线程(三)-线程安全原因与解决
  • Day26-二叉树的最小深度
  • 【软考中级网络工程师】知识点之 RIP 协议
  • C++ 之 【模拟实现 优先级队列】
  • SQL 地理空间原理与实现
  • slice() 和 splice()
  • 信创及一次ORACLE到OB的信创迁移
  • 自由学习记录(76)
  • Python 的标准库 bisect 模块
  • 源码交易平台排行榜
  • 机器学习 决策树基本介绍
  • Mysql的MVCC是什么
  • HCIE-Datacom题库_07_设备【道题】
  • 《深入解析 Python 的 `*args` 和 `**kwargs`:从基础使用到高级应用》
  • 【数据结构】哈希表实现
  • 网关和BFF是如何演化的
  • uniapp 跨端开发
  • 基于Springboot+UniApp+Ai实现模拟面试小工具八:管理端基础功能实现
  • (论文速读)探索多模式大型语言模型的视觉缺陷