赞
踩
时间:2020-9-16
题目地址:https://leetcode-cn.com/problems/top-k-frequent-elements/
题目难度:Medium
题目描述:
给定一个非空的整数数组,返回其中出现频率前 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 个高频元素的集合是唯一的。
你可以按任意顺序返回答案。
思路1:直接排序 用计数 collections.Counter 的 most_common
代码段1:通过
- from collections import Counter
- class Solution:
- def topKFrequent(self, nums: List[int], k: int) -> List[int]:
- res = []
- num_count = Counter(nums)
- top_k = num_count.most_common(k)
- print(top_k)
- for i, j in top_k:
- res.append(i)
- return res
总结:
这是第一反应,python的api就是多
思路2:优先队列
代码段2:通过
- from collections import Counter
- class Solution:
- def topKFrequent(self, nums: List[int], k: int) -> List[int]:
- num_count = Counter(nums)
- print(num_count)
- return heapq.nlargest(k, num_count.keys(), key = num_count.get)
总结:这个是完全不熟的
思路3:哈希+排序
代码段3:通过
- from collections import Counter
- class Solution:
- def topKFrequent(self, nums: List[int], k: int) -> List[int]:
- a_hash = {}
- for i in nums:
- a_hash[i] = a_hash.get(i, 0) + 1
- res = sorted(a_hash.items(), key = lambda s: s[1], reverse = True)
- return [res[i][0] for i in range(k)]
总结:很多东西自己学了,但是用不起来
后续优化:自己实现堆、优先队列、https://leetcode-cn.com/problems/top-k-frequent-elements/solution/python-dui-pai-xu-by-xxinjiee/
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。