📅  最后修改于: 2023-12-03 14:55:23.112000             🧑  作者: Mango
在这个题目中,我们需要找到一个数组中最长的子数组,该子数组不超过K个不同元素。
这是一个滑动窗口的经典问题,我们可以维护一个窗口,使得窗口内的元素不超过k个,同时不停地更新答案,直到遍历完整个数组。
具体的做法是,使用两个指针left和right作为窗口的边界,同时使用一个哈希表来统计元素出现的频次。当我们遇到一个新元素时,我们将其加入哈希表中,如果此时哈希表中不同元素的个数超过了K,那么我们需要左移left指针,直到哈希表中的不同元素个数重新小于等于K。在每一次更新答案时,我们只需要记录此时的窗口大小即可。
下面是一个Python实现的代码片段:
def max_subarray(nums, k):
n = len(nums)
left, right = 0, 0
freq = {}
res = 0
while right < n:
freq[nums[right]] = freq.get(nums[right], 0) + 1
while len(freq) > k:
freq[nums[left]] -= 1
if freq[nums[left]] == 0:
del freq[nums[left]]
left += 1
res = max(res, right - left + 1)
right += 1
return res
需要注意的是,在遍历完整个数组之后,我们需要再次更新一次答案,因为此时窗口中可能还有一些元素没有被统计。