开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第32天,点击查看活动详情
前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 个高频元素的集合是唯一的。 你可以按任意顺序返回答案。
-
来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/to…
解法
题解:leetcode-cn.com/problems/to…
个人思路:
- 字典排序: 时间复杂度为o(nlgn) 空间复杂度为o(n)
- 优先队列:
- 调包:
collections
中的Counter
class Solution:
def topKFrequent(self, nums: List[int], k: int) -> List[int]:
if nums is None or len(nums) == 1:
return nums
# 字典排序
'''
res = {}
for i in nums:
if i in res:
res[i] += 1
else:
res[i] = 1
# sort_res = sorted(res.items(), key=lambda x: x[1], reverse=True)
# return [i[0] for i in sort_res[:k]]
'''
# 优先队列
'''
import heapq
heap = []
for kk, v in res.items():
heapq.heappush(heap, (-v, kk))
res = []
for _ in range(k):
res.append(heapq.heappop(heap)[1])
return res
'''
# 使用包 collections
from collections import Counter
counter=collections.Counter(nums)
res = counter.most_common(k)
return [i[0] for i in res]