📜  最长子数组不超过 K 个不同元素(1)

📅  最后修改于: 2023-12-03 14:55:23.112000             🧑  作者: Mango

最长子数组不超过 K 个不同元素

在这个题目中,我们需要找到一个数组中最长的子数组,该子数组不超过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

需要注意的是,在遍历完整个数组之后,我们需要再次更新一次答案,因为此时窗口中可能还有一些元素没有被统计。