347. Top K Frequent Elements 前K个高频元素

1. 原始题目

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

示例 1:

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

示例 2:

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

说明:

  • 你可以假设给定的 总是合理的,且 1 ≤ k ≤ 数组中不相同的元素的个数。
  • 你的算法的时间复杂度必须优于 O(n log n) , 是数组的大小。

2. 思路(两种方法)

1. 直接利用哈希表排序然后输出前K高频元素即可。

2. 也可以利用优先队列。注意python3的优先队列默认是最小堆,即最小元素先出队。

3. 实现

 1 class Solution:
 2     def topKFrequent(self, nums: List[int], k: int) -> List[int]:
 3         if k<0 or k>len(nums): return []
 4         from collections import defaultdict
 5         temp = defaultdict(int)
 6         for i in nums:
 7             temp[i]+=1
 8         sorted_dict = list(sorted(temp.items(), key=lambda x:x[1], reverse=True))  # 对字典排序
 9         
10         res = []
11         for i in range(k):
12             res.append(sorted_dict[i][0])
13         return res

注意优先队列的使用:

 1 class Solution:
 2     def topKFrequent(self, nums, k: int):
 3         if k<0 or k>len(nums): return []
 4         from queue import PriorityQueue
 5         from collections import defaultdict
 6         queue = PriorityQueue()
 7         d = defaultdict(int)
 8         res = []
 9         for i in nums:
10             d[i]+=1
11         d = list(d.items())
12         print(d)
13         for i in range(len(d)):
14             queue.put([-d[i][1],d[i][0]])      # 因为是个最小堆,最小元素先出队,所以这里对排序的项取负。对频数取负。
15         for i in range(k):
16             res.append(queue.get()[1])
17         return res
posted @ 2019-05-12 16:36  三年一梦  阅读(260)  评论(0编辑  收藏  举报