📌  相关文章
📜  n 个范围内出现的最大整数 |组 3(1)

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

介绍题目「n 个范围内出现的最大整数 |组 3」

题意

给定一个长度为 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) 空间,以存储每个数的出现频率。

参考资料