📅  最后修改于: 2023-12-03 15:33:04.936000             🧑  作者: Mango
给定一个长度为 n 的数组 nums,num[i] 的范围在 [1,n] 内,每个整数都可能出现 0 次或多次。我们需要找到一个在范围 [1,n] 内的最大的整数,满足它在数组中出现的次数不少于 nums 中所有出现次数的一半,即 count(m) >= count(num[i])/2,其中 m 为目标整数。
为了最大化目标整数,我们将所有数按照出现次数排序,然后从大到小枚举每个数,判断是否满足条件。可以用 hashmap 统计每个数的出现次数,并用 priority_queue(堆)排序。
具体实现见下方的代码片段。
from typing import List
import heapq
import collections
def max_num(nums: List[int]) -> int:
freq = collections.defaultdict(int)
for num in nums:
freq[num] += 1
heap = [(-count, num) for num, count in freq.items()]
heapq.heapify(heap)
for i in range((len(nums)+1)//2):
count, num = heapq.heappop(heap)
if -count >= (len(nums)+1)//2:
return num
return -1
堆排序的时间复杂度为 O(nlogn),而 hashmap 统计出现频率的复杂度为 O(n),因此总时间复杂度为 O(nlogn)。
hashmap 需要额外的 O(n) 空间,以存储每个数的出现频率。