- 魔法师2026-08-1213093
力扣 LeetCode

2958. 最多 K 个重复元素的最长子数组 - 力扣(LeetCode)
2958. 最多 K 个重复元素的最长子数组 - 给你一个整数数组 nums 和一个整数 k 。
一个元素 x 在数组中的 频率 指的是它在数组中的出现次数。
如果一个数组中所有元素的频率都 小于等于 k ,那么我们称这个数组是 好 数组。
请你返回 nums 中 最长好 子数组的长度。
子数组 指的是一个数组中一段连续非空的元素序列。
示例 1:
输入:nums = [1,2,3,1,2,3,1,2], k = 2
输出:6
解释:最长好子数组是 [1,2,3,1,2,3]...思路
要求连续序列,典型的滑动窗口。
代码```
class Solution {
public int maxSubarrayLength(int[] nums, int k) {
HashMap<Integer, Integer> cnt = new HashMap<>();
int slow = 0;
int ans = 0;
for (int fast = 0; fast < nums.length; fast++) {
int v = cnt.merge(nums[fast], 1, Integer::sum);
if (v > k) {
ans = Math.max(ans, fast - slow);
do {
cnt.merge(nums[slow], -1, Integer::sum);
} while (nums[slow++] != nums[fast]);
}
}
return Math.max(ans, nums.length - slow);
}
}主楼 - SomeBottle2026-08-1211179
比较常规的哈希表 + 滑动窗口题。```
class Solution {
public:
int maxSubarrayLength(vector<int>& nums, int k) {
// 找的是连续非空子序列,且涉及计数,应该是滑动窗口+哈希表
unordered_map<int,int> cnts;
int l=0,r=0;
int n=nums.size();
int res=0;
while(r<n){
// 当 nums[r] 计数已经等于 k 时,再加上当前这个 nums[r] 就超过了
while(cnts[nums[r]]==k&&l<n){
cnts[nums[l]]--;
l++;
}
cnts[nums[r]]++;
r++;
res=max(res,r-l);
}
return res;
}
}; - Infinity4B2026-08-1221802
算术评级 5 第 119 场双周赛 Q3 难度分 1535
也是不用怎么思考```
class Solution:
def maxSubarrayLength(self, nums: List[int], k: int) -> int:
count=defaultdict(int)
l=0
count[nums[0]]+=1
ans=1
for i in range(1,len(nums)):
count[nums[i]]+=1
if count[nums[i]]>k:
while nums[l]!=nums[i]:
count[nums[l]]-=1
l+=1
count[nums[l]]-=1
l+=1
ans=max(ans,i-l+1)
return ans - CPython2026-08-1214995
滑动滑动, btw,更新之后 ctrl + E 都不好使了,直接跳到谷歌搜索了```
class Solution:
def maxSubarrayLength(self, nums: List[int], k: int) -> int:
from collections import defaultdict
ans = 0
n = len(nums)
l = 0
cnt = defaultdict(int)
for r, x in enumerate(nums):
cnt[x] += 1
while cnt[x] > k:
cnt[nums[l]] -= 1
l += 1
ans = max(ans, r - l + 1)
return ans - doge2026-08-1228633
Note: defaultdict比Counter快好多```
class Solution:
def maxSubarrayLength(self, nums: List[int], k: int) -> int:
n = len(nums)
cnt = defaultdict(int)ans = left = 0
for right in range(n):
cnt[nums[right]] += 1
while cnt[nums[right]] > k:
cnt[nums[left]] -= 1
left += 1
ans = max(ans, right - left + 1)
return ans