📌  相关文章
📜  执行给定操作后数组中唯一值的最大数量(1)

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

执行给定操作后数组中唯一值的最大数量

介绍

给定一个整数数组 nums 和一个整数 k ,你需要执行 k 次操作,每次操作将数组中的任意一个元素替换为一个任意的新元素。每次操作后,数组中的所有元素都需要保持唯一性。请你返回执行 k 次操作后,数组中唯一值的最大数量。

示例

输入:nums = [1,2,2,3,3,4], k = 3
输出:5
解释:执行 3 次操作后,nums 中的最大唯一值为 5,例如,可以将 nums[0] 从 1 更改为 4,nums[1] 和 nums[2] 从 2 变为 5,nums[3] 和 nums[4] 从 3 变为 6 。

解题思路

可以认为执行 k 次操作时,最大唯一值的数量不会超过 k + 1,因此可以枚举最大唯一值的数量 x(注意当 x 的值超过数组的长度时,需要特判)。对于一个固定的 x,需要考虑如何执行若干次操作才能将 nums 中的值变为最大唯一值数量为 x。

对元素按出现次数从大到小排序,每次选择出现次数最多但没有被填过的元素进行填充。如果当前出现次数最大的元素填充完后,还有剩余的操作次数 k 没有用完,则可以将任意一个未被填充过的元素填充为新的元素。

代码实现
from typing import List

class Solution:
    def findMaximizedUniqueNums(self, nums: List[int], k: int) -> int:
        count = {}
        for num in nums:
            count[num] = count.get(num, 0) + 1
        sorted_count = sorted(count.items(), key=lambda x: -x[1])
        x = 0
        for i in range(len(sorted_count)):
            if sorted_count[i][1] > k // (len(sorted_count) - i):
                x += k // (len(sorted_count) - i)
                break
            else:
                x += sorted_count[i][1]
                k -= sorted_count[i][1] * (len(sorted_count) - i)
        else:
            x += k // len(sorted_count)
        return min(len(nums), x + k)
复杂度分析
  • 时间复杂度:O(nlogn),其中 n 为数组 nums 的长度,需要对元素按出现次数进行排序。
  • 空间复杂度:O(n),需要使用一个哈希表记录元素出现次数。