1+ #Bucket Sort
2+ class Solution :
3+ def topKFrequent (self , nums : List [int ], k : int ) -> List [int ]:
4+ bucket = collections .defaultdict (list )
5+ counter = collections .Counter (nums )
6+ ans = []
7+
8+ for num in counter :
9+ bucket [counter [num ]].append (num )
10+
11+ tempCount = len (nums )
12+ while len (ans )< k :
13+ ans .extend (bucket [tempCount ])
14+ tempCount -= 1
15+
16+ return ans
17+
18+ #QuickSelect
19+ class Solution :
20+ def topKFrequent (self , nums : List [int ], K : int ) -> List [int ]:
21+ def quickSelect (freqs , s , e , K ):
22+ i = s
23+ t = s
24+ j = e
25+ pivot = freqs [(s + e )// 2 ][1 ]
26+
27+ while t <= j :
28+ if freqs [t ][1 ]< pivot :
29+ freqs [i ], freqs [t ] = freqs [t ], freqs [i ]
30+ i += 1
31+ t += 1
32+ elif freqs [t ][1 ]> pivot :
33+ freqs [j ], freqs [t ] = freqs [t ], freqs [j ]
34+ j -= 1
35+ else :
36+ t += 1
37+ if e - j >= K :
38+ return quickSelect (freqs , j + 1 , e , K )
39+ elif e - (i - 1 )>= K :
40+ return pivot
41+ else :
42+ return quickSelect (freqs , s , i - 1 , K - (e - i + 1 ))
43+
44+ counts = collections .Counter (nums )
45+ freqs = [(num , counts [num ]) for num in counts ]
46+ ans = []
47+
48+ KthLargestFreq = quickSelect (freqs , 0 , len (freqs )- 1 , K )
49+
50+ for num , freq in freqs :
51+ if freq >= KthLargestFreq :
52+ ans .append (num )
53+ return ans
0 commit comments