📌  相关文章
📜  数组中最多有 K 个不同元素所需的最少替换次数(1)

📅  最后修改于: 2023-12-03 15:40:02.876000             🧑  作者: Mango

数组中最多有 K 个不同元素所需的最少替换次数
问题描述

给定一个整数数组 nums 和一个整数 k,你需要将 nums 中的元素替换,使得数组中最多只有 k 个不同的元素,并返回数组的最小替换次数。

解决方法

方法1:滑动窗口

将滑动窗口拆分成左右两端,左端为 i,右端为 j。j 先往右移动,每次更新窗口内的元素。当窗口内元素的种类数超过了 k 时,i 往右移动,将窗口收缩到满足要求的范围。在整个过程中,不断更新最小替换次数的值。

具体实现见以下代码:

def min_replace(nums, k):
    d = {}
    i, j = 0, 0
    n = len(nums)
    res = n
    while j < n:
        if nums[j] not in d:
            d[nums[j]] = 1
        else:
            d[nums[j]] += 1

        while len(d) > k:
            d[nums[i]] -= 1
            if d[nums[i]] == 0:
                del d[nums[i]]
            i += 1

        res = min(res, j - i + 1)
        j += 1

    return res

方法2:双指针

使用两个指针 left 和 right 分别表示当前窗口的左右端点。用字典记录每个元素出现的次数,当窗口内元素的种类数超过了 k 时,将 left 往右移动。

具体实现见以下代码:

def min_replace(nums, k):
    d = {}
    left, right = 0, 0
    n = len(nums)
    res = n
    while right < n:
        if nums[right] not in d:
            d[nums[right]] = 1
        else:
            d[nums[right]] += 1
            
        while len(d) > k:
            d[nums[left]] -= 1
            if d[nums[left]] == 0:
                del d[nums[left]]
            left += 1
        
        res = min(res, right - left + 1)
        right += 1

    return res
复杂度分析

时间复杂度:$O(n)$,其中 n 为数组长度。

空间复杂度:$O(k)$,最坏情况下字典 d 中最多存储 k 个键值对。

总结

题目描述:给定一个整数数组 nums 和一个整数 k,从 nums 中删除最小数量的元素,使得 nums 中最多只有 k 个不同的元素。

方法1:滑动窗口,将滑动窗口拆分成左右两端,左端为 i,右端为 j。j 先往右移动,每次更新窗口内的元素。当窗口内元素的种类数超过了 k 时,i 往右移动,将窗口收缩到满足要求的范围。在整个过程中,不断更新最小替换次数的值。

方法2:双指针,使用左右指针 left 和 right 表示窗口的左右端点。用字典记录窗口内每个元素的出现次数,当窗口内元素的种类数超过了 k 时,将左指针 left 往右移动。

两种方法的时间复杂度和空间复杂度均为 $O(n)$ 和 $O(k)$。

参考资料