Source code for src.top_k_frequent
from collections import defaultdict
[docs]
class Solution(): 
[docs]
    def topKFrequent(self, nums: list[int], k: int) -> list[int]:
        """
        ### Thought process
        - Place elements into frequency buckets `[index -> [n1, ..., n2]]` where `index` is the frequency of the numbers and `[n1, ..., n2]` are the numbers that have that frequency
        - Return the last k elements
        
        ### Notes 
        - time complexity: $O(n) + O(n) = O(n)$
        - space complexity: $O(2n) = O(n)$
        
        """
        # init bucket and count 
        count = {}
        freq = [[] for _ in range(len(nums) + 1)] 
        
        # count freq then place in bucket
        for n in nums:
            count[n] = count.get(n, 0) + 1 # index -> frequency
        for n, c in count.items():
            freq[c].append(n)              # frequency -> list of numbers
        
        # get k most frequent numbers
        res = []
        for i in range(len(freq) - 1, -1, -1):
            for n in freq[i]:
                res.append(n)
                if len(res) == k:
                    return res 
    
[docs]
    def topKFrequentCompact(self, nums: list[int], k: int) -> list[int]:
        """
        ### Thought process 
        - We can use a dictionary to store the frequency of each number
        - We can sort the dictionary by the frequency and return the last k elements
        
        ### Notes
        - time complexity: $O(n\\log n)$ 
        - space complexity: $O(n)$
        
        
        > I feel like you could use this in an interview, practically speaking its close to the bucket sort solution, I would probably expand the return value though, either that or kind of just explain it to the interviewer
        """
        m = defaultdict(int)
        for n in nums: 
            m[n] += 1 
        return list(dict(sorted(m.items(), key=lambda item: item[1])).keys())[len(m.keys()) - k:]