📅  最后修改于: 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)