Warning

Even though I solved the problem, I didn’t fully understand it.

Neetcode Answer

  • The difference between mine is that he uses the frequency list, instead of looping through the dictionary at the end

My Answer

class Solution:
    def topKFrequent(self, nums: List[int], k: int) -> List[int]:
        dic = defaultdict(int)
        reverseDic = defaultdict(list)
        for num in nums:
            dic[num] += 1
 
        for key in dic.keys():
            reverseDic[dic[key]].append(key)
 
        res = []
        remainingK = k
        for i in range(10 ** 4, -10 ** 4- 1, -1):             
            if i in dic.values():
                for val in reverseDic[i]:
                    if remainingK == 0:
                        return res
 
                    res.append(val)
                    remainingK -= 1
        
        return res

My Answer Using Length of String instead (same Speed 5%)

class Solution:
    def topKFrequent(self, nums: List[int], k: int) -> List[int]:
        dic = defaultdict(int)
        reverseDic = defaultdict(list)
        for num in nums:
            dic[num] += 1
 
        for key in dic.keys():
            reverseDic[dic[key]].append(key)
 
        res = []
        remainingK = k
        for i in range(len(nums), 0, -1):             
            if i in dic.values():
                for val in reverseDic[i]:
                    if remainingK == 0:
                        return res
 
                    res.append(val)
                    remainingK -= 1
        
        return res

Another Attempt but Slower Time Expired by 1 Test case

class Solution:
    def topKFrequent(self, nums: List[int], k: int) -> List[int]:
        dic = defaultdict(list)
        for i in range(len(nums)):
            dic[nums.count(nums[i])].append(nums[i])
            
        res = []
        remainingK = k
        for count in range(len(nums), 0, -1):
            if count in dic.keys():           
                for val in dic[count]:
                    if remainingK == 0:
                        return res
 
                    if val not in res:
                        res.append(val)
                        remainingK -= 1
        
        return res

References

https://leetcode.com/problems/top-k-frequent-elements/