本文由旧博客内容整理迁入。原发布日期未提供,页面日期为本次整理日期。

题目

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

一个元素 x 在数组中的频率,指的是它在数组中的出现次数。如果一个数组中所有元素的频率都小于等于 k,那么称这个数组为好数组。

请返回 nums 中最长好子数组的长度。子数组是数组中一段连续非空的元素序列。

示例

示例 1

1
2
输入:nums = [1,2,3,1,2,3,1,2], k = 2
输出:6

解释:最长好子数组是 [1,2,3,1,2,3],值 1、2、3 的频率均未超过 2。[2,3,1,2,3,1] 和 [3,1,2,3,1,2] 也是长度为 6 的好子数组。

示例 2

1
2
输入:nums = [1,2,1,2,1,2,1,2], k = 1
输出:2

解释:最长好子数组是 [1,2] 或 [2,1],其中每个元素只出现一次。

示例 3

1
2
输入:nums = [5,5,5,5,5,5,5], k = 4
输出:4

解释:最长好子数组是 [5,5,5,5],值 5 的频率没有超过 4。

解题思路

直接见题解:统计窗口内元素的出现次数,只要新加入的元素出现次数超过 k,就移动左端点,直到窗口恢复合法。

C++ 题解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Solution {
public:
int maxSubarrayLength(vector<int>& nums, int k) {
unordered_map<int,int>arr;
int ans=0;
int left=0;
for(int i=0;i<nums.size();i++){
arr[nums[i]]++;
while(arr[nums[i]]>k){
arr[nums[left]]--;

left++;
}
ans=max(ans,i-left+1);
}
return ans;
}
};