[LeetCode] 347. Top K Frequent Elements_Medium tag: Array, Heap

Given an integer array nums and an integer k, return the k most frequent elements. You may return the answer in any order.

 

Example 1:

Input: nums = [1,1,1,2,2,3], k = 2
Output: [1,2]

Example 2:

Input: nums = [1], k = 1
Output: [1]

 

Constraints:

  • 1 <= nums.length <= 105
  • k is in the range [1, the number of unique elements in the array].
  • It is guaranteed that the answer is unique.

 

Follow up: Your algorithm's time complexity must be better than O(n log n), where n is the array's size.

Ideas:

1. 利用collections.Counter(), 得到num: countNum 的dictionary, 再将它根据countNum来排序,取前面k个即可。

n = len(nums),   m = len(distinct number )

T: O(m * lgm)      S: O(m)

class Solution:
    def topKFrequent(self, nums: List[int], k: int) -> List[int]:
        d = collections.Counter(nums)
        ans, freqs = [], sorted([(d[num], num) for num in d], reverse = True)
        for i in range(k):
            ans.append(freqs[i][1])
        return ans

 

2. 利用heap和python的heapq.nlargest()method

T: O(n * lgk)   S: O(k)

class Solution(object):
    def topKFrequent(self, nums, k):
        """ Given a non-empty array of integers, return the k most frequent elements.

        heapq.nlargest(n, iterable[, key])
        Return a list with the n largest elements from the dataset defined by iterable.
        """
        count = collections.Counter(nums)
        return heapq.nlargest(k, count, key=lambda x: count[x])

 

3. TODO: quicksort or quick select. 

 

上一篇:在核心线程数已满的情况下如何实现阻塞队列?


下一篇:SAP Fiori Elements List Report table 里的普通按钮,Global 按钮 和 Determining 按钮