哈希,堆--前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
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路:

  1. 哈希记录次数,暴力对比取值
  2. from collections import Counter
    [_[0] for _ in Counter(nums).most_common(k)]
  3. 小顶堆
    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    
上一篇下一篇

猜你喜欢

热点阅读