news 2026/4/19 1:39:30

LeetCode 2958. 最多 K 个重复元素的最长子数组【不定长滑窗】1535

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
LeetCode 2958. 最多 K 个重复元素的最长子数组【不定长滑窗】1535

本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章中,我不仅会讲解多种解题思路及其优化,还会用多种编程语言实现题解,涉及到通用解法时更将归纳总结出相应的算法模板。

为了方便在PC上运行调试、分享代码文件,我还建立了相关的仓库:https://github.com/memcpy0/LeetCode-Conquest。在这一仓库中,你不仅可以看到LeetCode原题链接、题解代码、题解文章链接、同类题目归纳、通用解法总结等,还可以看到原题出现频率和相关企业等重要信息。如果有其他优选题解,还可以一同分享给他人。

由于本系列文章的内容随时可能发生更新变动,欢迎关注和收藏征服LeetCode系列文章目录一文以作备忘。

给你一个整数数组nums和一个整数k

一个元素x在数组中的频率指的是它在数组中的出现次数。

如果一个数组中所有元素的频率都小于等于k,那么我们称这个数组是数组。

请你返回nums最长好子数组的长度。

子数组指的是一个数组中一段连续非空的元素序列。

示例 1:

输入:nums=[1,2,3,1,2,3,1,2],k=2输出:6解释:最长好子数组是[1,2,3,1,2,3],值123在子数组中的频率都没有超过 k=2[2,3,1,2,3,1][3,1,2,3,1,2]也是好子数组。 最长好子数组的长度为6

示例 2:

输入:nums=[1,2,1,2,1,2,1,2],k=1输出:2解释:最长好子数组是[1,2],值12在子数组中的频率都没有超过 k=1[2,1]也是好子数组。 最长好子数组的长度为2

示例 3:

输入:nums=[5,5,5,5,5,5,5],k=4输出:4解释:最长好子数组是[5,5,5,5],值5在子数组中的频率没有超过 k=4。 最长好子数组的长度为4

提示:

  • 1 <= nums.length <= 10^5
  • 1 <= nums[i] <= 10^9
  • 1 <= k <= nums.length

解法 不定长滑窗(求最长但越短越容易合法)

对于本题,新加入元素x = n u m s [ r i g h t ] x=nums[right]x=nums[right]后,如果x xx的出现次数超过k kk,则不断右移左指针 left,直到窗口内的x xx的出现次数等于k kk为止,然后用窗口大小r i g h t − l e f t + 1 right−left+1rightleft+1更新答案的最大值。

classSolution{publicintmaxSubarrayLength(int[]nums,intk){intans=0;intleft=0;Map<Integer,Integer>cnt=newHashMap<>();for(intright=0;right<nums.length;right++){cnt.merge(nums[right],1,Integer::sum);// cnt[nums[right]]++while(cnt.get(nums[right])>k){cnt.merge(nums[left],-1,Integer::sum);// cnt[nums[left]]--left++;}ans=Math.max(ans,right-left+1);}returnans;}}
classSolution{public:intmaxSubarrayLength(vector<int>&nums,intk){intans=0,left=0;unordered_map<int,int>cnt;for(intright=0;right<nums.size();right++){cnt[nums[right]]++;while(cnt[nums[right]]>k){cnt[nums[left]]--;left++;}ans=max(ans,right-left+1);}returnans;}};
classSolution:defmaxSubarrayLength(self,nums:List[int],k:int)->int:ans=left=0cnt=defaultdict(int)forright,xinenumerate(nums):cnt[x]+=1whilecnt[x]>k:cnt[nums[left]]-=1left+=1ans=max(ans,right-left+1)returnans
funcmaxSubarrayLength(nums[]int,kint)(ansint){cnt:=map[int]int{}left:=0forright,x:=rangenums{cnt[x]++forcnt[x]>k{cnt[nums[left]]--left++}ans=max(ans,right-left+1)}return}

复杂度分析:

  • 时间复杂度:O ( n ) O(n)O(n)
  • 空间复杂度:O ( n ) O(n)O(n)
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/19 1:37:18

告别HAL_Delay卡死:STM32中断服务函数里实现精准延时的3种替代方案

告别HAL_Delay卡死&#xff1a;STM32中断服务函数里实现精准延时的3种替代方案 在嵌入式开发中&#xff0c;中断服务函数(ISR)的设计直接影响系统的实时性和稳定性。许多开发者习惯性地在ISR中使用HAL_Delay这类阻塞式延时函数&#xff0c;结果发现系统莫名其妙地卡死。这背后隐…

作者头像 李华
网站建设 2026/4/19 1:37:17

洛阳静脉曲张自查:腿沉酸胀水肿,你需要注意的几大信号

大家好&#xff0c;今天咱们聊聊一个常见但又容易被忽视的问题——静脉曲张。特别是对于那些经常站立工作、久坐不动或者有家族史的朋友来说&#xff0c;了解静脉曲张的症状和预防措施尤为重要。下面&#xff0c;我们就一起来看看腿沉酸胀水肿等几个重要的信号&#xff0c;以及…

作者头像 李华
网站建设 2026/4/19 1:30:39

【Goby实战指南】从零到一:自动化漏洞扫描与攻击面管理的核心应用

1. Goby是什么&#xff1f;为什么安全工程师都在用它&#xff1f; 第一次接触Goby是在一次企业内网渗透测试项目中。当时客户给了一个庞大的IP段&#xff0c;要求一周内完成漏洞评估。传统工具要么扫描速度慢&#xff0c;要么漏报率高&#xff0c;直到团队里的老张推荐了Goby。…

作者头像 李华
网站建设 2026/4/19 1:22:15

服装商城|基于springboot + vue服装商城系统(源码+数据库+文档)

服装商城系统 目录 基于springboot vue服装商城系统 一、前言 二、系统功能演示 详细视频演示 三、技术选型 四、其他项目参考 五、代码参考 六、测试参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 基于springboot vue服装商城系统 一、前言 博主介绍…

作者头像 李华