哈希,堆--前k个高频元素(medium)
2020-12-31 本文已影响0人
warManHy
给定一个非空的整数数组,返回其中出现频率前 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)
链接:https://leetcode-cn.com/problems/top-k-frequent-elements
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路:
- 哈希记录次数,暴力对比取值
- from collections import Counter
[_[0] for _ in Counter(nums).most_common(k)] - 小顶堆
topk (前k大)用小根堆,维护堆大小不超过 k 即可。每次压入堆前和堆顶元素比较,如果比堆顶元素还小,直接扔掉,否则压入堆。检查堆大小是否超过 k,如果超过,弹出堆顶。复杂度是 nlogk
避免使用大根堆,因为你得把所有元素压入堆,复杂度是 nlogn,而且还浪费内存。如果是海量元素,那就挂了
class Solution(object):
def topKFrequent(self, nums, k):
"""
:type nums: List[int]
:type k: int
:rtype: List[int]
"""
if len(nums) <= 1 or len(nums) < k:
return nums
hash = dict()
for i in nums:
if i in hash:
hash[i] += 1
else:
hash[i] = 1
# {1:3, 2:2, 3:1}
topk = sorted([i for i in hash.values()])[-k:]
# [3,2]
# print topk
arr = []
for k,v in hash.items():
if v in topk:
arr.append(k)
# print arr
return arr