LeetCode 347*. 前 K 个高频元素(Python)

简介: 给定一个非空的整数数组,返回其中出现频率前 k 高的元素。

给定一个非空的整数数组,返回其中出现频率前 k 高的元素。


示例 1:


输入: nums = [1,1,1,2,2,3], k = 2

输出: [1,2]


示例 2:


输入: nums = [1], k = 1

输出: [1]


说明:


你可以假设给定的 k 总是合理的,且 1 ≤ k ≤ 数组中不相同的元素的个数。

你的算法的时间复杂度必须优于 O(n log n) , n 是数组的大小。



思路:


最简单的思路,扫描一遍统计频率,再排序找到前k个出现频率最高的元素,时间:O(nlogn),由于题目要求小于这个复杂度,故可以采取优先队列的方法如下:


维护一个k元素的优先队列,如果遍历到的数字出现频率比队列中最小频率元素频率高,则取出队列中最小频率的元素,将新元素入队,最终队列中剩下k个频率最高的元素,时间:O(nlogk) < O(nlogn)


class Solution:
    def topKFrequent(self, nums: List[int], k: int) -> List[int]:
        import queue
        result = list()
        freq = dict()   # key:数,value:该数出现的频次
        for i in nums:
            freq[i] = 0
        for i in nums:
            freq[i] = freq[i] + 1
        # 使用优先队列
        pq = queue.PriorityQueue()
        for key in freq:
            if pq.qsize() == k:
                a = pq.get()
                if freq[key] > a[0]:
                    pq.put([freq[key], key])    # 队列中存储[频率,数字]
                else:
                    pq.put(a)
            else:
                pq.put([freq[key], key])
        while not pq.empty():
            temp = pq.get()
            result.append(temp[1])
        return result


相关文章
|
1月前
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
68 2
|
1月前
|
存储 算法
LeetCode第83题删除排序链表中的重复元素
文章介绍了LeetCode第83题"删除排序链表中的重复元素"的解法,使用双指针技术在原链表上原地删除重复元素,提供了一种时间和空间效率都较高的解决方案。
LeetCode第83题删除排序链表中的重复元素
|
28天前
|
程序员 Python
Python 将元素添加到列表
【8月更文挑战第21天】
35 3
|
1月前
|
算法 索引
LeetCode第34题在排序数组中查找元素的第一个和最后一个位置
这篇文章介绍了LeetCode第34题"在排序数组中查找元素的第一个和最后一个位置"的解题方法,通过使用双指针法从数组两端向中间同时查找目标值,有效地找到了目标值的首次和最后一次出现的索引位置。
LeetCode第34题在排序数组中查找元素的第一个和最后一个位置
|
1月前
|
算法 Python
【Leetcode刷题Python】 LeetCode 2038. 如果相邻两个颜色均相同则删除当前颜色
本文介绍了LeetCode 2038题的解法,题目要求在一个由'A'和'B'组成的字符串中,按照特定规则轮流删除颜色片段,判断Alice是否能够获胜,并提供了Python的实现代码。
36 3
|
1月前
|
算法 Python
【Leetcode刷题Python】剑指 Offer 33. 二叉搜索树的后序遍历序列
本文提供了一种Python算法,用以判断给定整数数组是否为某二叉搜索树的后序遍历结果,通过识别根节点并递归验证左右子树的值是否满足二叉搜索树的性质。
14 3
|
1月前
|
Python
【Leetcode刷题Python】50. Pow(x, n)
本文介绍了LeetCode第50题"Pow(x, n)"的解法,题目要求实现计算x的n次幂的函数,文章提供了递归分治法的详细解析和Python实现代码。
15 1
|
1月前
|
Python
【Leetcode刷题Python】LeetCode 478. 在圆内随机生成点
本文介绍了LeetCode 478题的解法,题目要求在给定圆的半径和圆心位置的情况下实现在圆内均匀随机生成点的功能,并提供了Python的实现代码。
16 1
|
1月前
|
算法 Python
【Leetcode刷题Python】295. 数据流的中位数
本文介绍了一种使用Python实现的数据结构,用以支持数据流中添加整数并返回当前所有元素的中位数,通过排序列表来计算中位数。
14 1
|
20天前
|
Python
python在列表、元素、字典、集合和numpy的数组前加上星号 * 是什么含义,以及*args和**kwargs的使用
python在列表、元素、字典、集合和numpy的数组前加上星号 * 是什么含义,以及*args和**kwargs的使用
24 0