1. 程式人生 > 其它 >[LeetCode] 347. Top K Frequent Elements_Medium tag: Array, Heap

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

Given an integer arraynumsand an integerk, returnthekmost frequent elements. You may return the answer inany 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
  • kis in the range[1, the number of unique elements in the array]
    .
  • It isguaranteedthat the answer isunique.

Follow up:Your algorithm's time complexity must be better thanO(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.