项目场景:
给你一个整数数组 nums
和一个整数 k
。
一个元素 x
在数组中的 频率 指的是它在数组中的出现次数。
如果一个数组中所有元素的频率都 小于等于 k
,那么我们称这个数组是 好 数组。
请你返回 nums
中 最长好 子数组的长度。
子数组 指的是一个数组中一段连续非空的元素序列。
示例 1:
输入:nums = [1,2,3,1,2,3,1,2], k = 2 输出:6 解释:最长好子数组是 [1,2,3,1,2,3] ,值 1 ,2 和 3 在子数组中的频率都没有超过 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] ,值 1 和 2 在子数组中的频率都没有超过 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 <= 105
1 <= nums[i] <= 109
1 <= k <= nums.length
问题描述
这题要求最多K个重复元素的最长子数组,也就是说,子数组里每种元素的出现个数必须少于等于k。这题是一道典型的滑动窗口问题,在遍历过程中,我们用哈希表记录元素的出现次数,并不断更新滑动窗口的左端点值,并更新ans的值为ans和right-left+1中的较大者,最终返回ans即可。
class Solution:
def maxSubarrayLength(self, nums: List[int], k: int) -> int:
ans=left=0
cnt=defaultdict(int)
for right,x in enumerate(nums):
cnt[x]+=1
while cnt[x]>k:
cnt[nums[left]]-=1
if cnt[nums[left]]==0:
del cnt[nums[left]]
left+=1
ans=max(ans,right-left+1)
return ans
以上为本篇文章的全部内容,感谢你抽出宝贵的时间阅读这篇文章。如果你有任何疑问或建议,欢迎在评论区留言,我们一起交流进步。愿你的代码之路越走越顺,生活充满阳光!