1
+ // 1번풀이 (brute force)
2
+ type FrequencyMap = Record < number , number > ;
3
+
4
+ function topKFrequentCountDown ( nums : number [ ] , k : number ) : number [ ] {
5
+ const freqMap = buildFrequencyMap1 ( nums ) ;
6
+ return pickTopKDescending ( freqMap , k ) ;
7
+ }
8
+
9
+ function buildFrequencyMap1 ( nums : number [ ] ) : FrequencyMap {
10
+ const map : FrequencyMap = { } ;
11
+ for ( const num of nums ) {
12
+ map [ num ] = ( map [ num ] || 0 ) + 1 ;
13
+ }
14
+ return map ;
15
+ }
16
+
17
+ function pickTopKDescending ( freqMap : FrequencyMap , k : number ) : number [ ] {
18
+ const result : number [ ] = [ ] ;
19
+ const entries = Object . entries ( freqMap ) . map ( ( [ key , value ] ) => [
20
+ Number ( key ) ,
21
+ value ,
22
+ ] ) ;
23
+ let currentFrequent = Math . max ( ...entries . map ( ( [ _ , freq ] ) => freq ) ) ;
24
+
25
+ while ( result . length < k && currentFrequent > 0 ) {
26
+ for ( const [ num , freq ] of entries ) {
27
+ if ( freq === currentFrequent ) {
28
+ result . push ( num ) ;
29
+ if ( result . length === k ) break ;
30
+ }
31
+ }
32
+ currentFrequent -- ;
33
+ }
34
+
35
+ return result ;
36
+ }
37
+
38
+
39
+ // 2번풀이(Bucket Sort)
40
+ function topKFrequent ( nums : number [ ] , k : number ) : number [ ] {
41
+ const frequencyMap = buildFrequencyMap2 ( nums ) ;
42
+ const frequencyBuckets = buildFrequencyBuckets ( nums . length , frequencyMap ) ;
43
+
44
+ return collectTopKFrequent ( frequencyBuckets , k ) ;
45
+ }
46
+
47
+ function buildFrequencyMap2 ( nums : number [ ] ) : FrequencyMap {
48
+ const freqMap : FrequencyMap = { } ;
49
+ for ( const num of nums ) {
50
+ freqMap [ num ] = ( freqMap [ num ] || 0 ) + 1 ;
51
+ }
52
+ return freqMap ;
53
+ }
54
+
55
+ function buildFrequencyBuckets (
56
+ size : number ,
57
+ freqMap : FrequencyMap
58
+ ) : number [ ] [ ] {
59
+ const buckets : number [ ] [ ] = Array ( size + 1 ) . fill ( null ) . map ( ( ) => [ ] ) ;
60
+
61
+ for ( const [ numStr , frequent ] of Object . entries ( freqMap ) ) {
62
+ const num = Number ( numStr ) ;
63
+ buckets [ frequent ] . push ( num ) ;
64
+ }
65
+
66
+ return buckets ;
67
+ }
68
+
69
+ function collectTopKFrequent ( buckets : number [ ] [ ] , k : number ) : number [ ] {
70
+ const result : number [ ] = [ ] ;
71
+
72
+ for ( let i = buckets . length - 1 ; i >= 0 && result . length < k ; i -- ) {
73
+ for ( const num of buckets [ i ] ) {
74
+ result . push ( num ) ;
75
+ if ( result . length === k ) break ;
76
+ }
77
+ }
78
+
79
+ return result ;
80
+ }
81
+
82
+
83
+ // 3번풀이 (MinHeap)
84
+ function topKFrequentHeap ( nums : number [ ] , k : number ) : number [ ] {
85
+ const freqMap : Record < number , number > = { } ;
86
+
87
+ for ( const num of nums ) {
88
+ freqMap [ num ] = ( freqMap [ num ] || 0 ) + 1 ;
89
+ }
90
+
91
+ const heap : [ number , number ] [ ] = [ ] ;
92
+ for ( const [ numStr , frequent ] of Object . entries ( freqMap ) ) {
93
+ const num = Number ( numStr ) ;
94
+
95
+ heap . push ( [ num , frequent ] ) ;
96
+ heap . sort ( ( a , b ) => a [ 1 ] - b [ 1 ] ) ;
97
+
98
+ if ( heap . length > k ) {
99
+ heap . shift ( ) ;
100
+ }
101
+ }
102
+
103
+ return heap . map ( ( [ num ] ) => num ) ;
104
+ }
105
+
0 commit comments