LeetCode-Python-347. 前K个高频元素

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

示例 1:

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

示例 2:

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

说明:

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

第一种思路:

调库

class Solution(object):
    def topKFrequent(self, nums, k):
        """
        :type nums: List[int]
        :type k: int
        :rtype: List[int]
        """
        return [digit for digit, fre in collections.Counter(nums).most_common(k)]

第二种思路:

题目问前K个高频,就是求前k个出现次数最大的元素。

经典的TOP k问题一般都是用heap,此题同理。

比较朴素的方法是:

先统计一下每个元素出现的频率,然后把这些频率建最大堆,保证堆顶元素出现频率最大,

然后pop k次 堆顶,即可找到前k个出现次数最大的元素。

class Solution(object):
    def topKFrequent(self, nums, k):
        """
        :type nums: List[int]
        :type k: int
        :rtype: List[int]
        """
        
        from collections import Counter
        from heapq import *
        # time: O(nlogn)
        # space: O(n)
        dic = Counter(nums) # O(n)
        
        heap = []
        heapify(heap)
        for key, val in dic.items():
            heappush(heap, (-val, key)) # O(nlogn)
            
        # print heap
        res = []
        while k: # O(klogn)
            top = heappop(heap)
            # print top
            res.append(top[1])
            k -= 1
        return res

第三种思路:

优化一下,实际上并不需要把所有元素都放进堆里,因为我们找到是前k个,所以堆的大小为k其实就够用了,

在这种情况下, 建立并维护一个size 为k 的最小堆,使得堆顶元素的出现频率是堆中所有元素出现频率中最小的,

遍历字典,如果一个元素当前出现频率 比 堆顶元素的出现频率都要小,则说明它必不可能是 TOP k 元素;

否则,将当前元素插入堆中,并pop一次,以保证最小堆的size始终为k。

class Solution(object):
    def topKFrequent(self, nums, k):
        """
        :type nums: List[int]
        :type k: int
        :rtype: List[int]
        """
        
        from collections import Counter
        from heapq import *
        
        # time: O(nlogk)
        # space: O(n)
        dic = Counter(nums) # O(n)
        
        heap = []
        heapify(heap)
        
        for key, val in dic.items(): # O(nlogk)
            if len(heap) < k:
                heappush(heap, (val, key))
            else:
                if heap[0][0] < val:
                    heappush(heap, (val, key))
                    heappop(heap)
            
        # print heap
        res = []
        while heap: # O(klogk)
            top = heappop(heap)
            res.append(top[1])
        return res

 

你可能感兴趣的:(Leetcode)