📜  删除 M 项后的最小不同元素数 | 2套(1)

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

删除 M 项后的最小不同元素数

给定一个元组和一个整数 M,从该元组中删除 M 个元素,使得剩余元素的种类数最小。返回种类数。

示例
输入: [1,2,3,4,5], M = 2
输出: 3
解释: 删除 2 个元素后,剩余元素为 [1,2,3] 或者 [2,3,4],均有 3 种不同的元素。

输入: [1,1,2,3,3,3], M = 3
输出: 2
解释: 删除 3 个元素后,剩余元素为 [1,2] 或者 [2,3],均有 2 种不同的元素。
解法

要想剩余元素的种类数最小,我们需要删除的是出现次数最多的元素。我们可以先统计每个元素出现的次数,然后按照出现次数从大到小排序。接着我们从出现次数最多的元素开始删除,直到删除 M 次或者某种元素被删除完,便可以得到剩余元素的种类数。

代码
def min_different_elements(nums: List[int], M: int) -> int:
    count = collections.Counter(nums)
    sorted_count = sorted(count.items(), key=lambda x: x[1], reverse=True)
    for key, value in sorted_count:
        if M >= value:
            M -= value
        else:
            return len(sorted_count) - 1
    return len(sorted_count)
复杂度分析
  • 时间复杂度:O(NlogN),其中 N 是元素的数量,需要 O(N) 的时间统计每个元素的出现次数,需要 O(NlogN) 的时间对出现次数进行排序。
  • 空间复杂度:O(N),其中 N 是元素的数量,需要 O(N) 的空间存储每个元素的出现次数。