Skip to content

Commit 0b725bb

Browse files
committed
add: DaleStudy#347 top k frequent elements
1 parent 8ff78df commit 0b725bb

File tree

1 file changed

+105
-0
lines changed

1 file changed

+105
-0
lines changed

top-k-frequent-elements/suKyoung.ts

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
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

Comments
 (0)