美文网首页
哈希,堆--前k个高频元素(medium)

哈希,堆--前k个高频元素(medium)

作者: warManHy | 来源:发表于2020-12-31 00:56 被阅读0次
    给定一个非空的整数数组,返回其中出现频率前 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    
    

    相关文章

      网友评论

          本文标题:哈希,堆--前k个高频元素(medium)

          本文链接:https://www.haomeiwen.com/subject/dfakoktx.html