Skip to content

Commit c4ac0d7

Browse files
committed
Top K Frequent Elements solution
1 parent 07878b4 commit c4ac0d7

File tree

1 file changed

+47
-0
lines changed

1 file changed

+47
-0
lines changed
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
/**
2+
* 문제 파악: 배열에서 가장 자주 등장하는 k개의 요소를 찾는 문제
3+
*
4+
* 접근 방식:
5+
* (1) Map을 사용하여 각 숫자가 배열에서 몇 번 등장하는지 빈도수 계산
6+
* (2) 문제의 요구사항에 따라 O(n log n)보다 빠른 시간 복잡도가 필요 => 버킷 정렬 활용 - 시간 복잡도 O(n)
7+
* (3) 가장 높은 빈도수를 가진 버킷부터 시작하여 k개의 요소를 결과 배열에 추가하여 리턴
8+
*
9+
* 코드 설명:
10+
* 각 숫자의 빈도수를 저장할 Map 생성해서, 모든 숫자의 빈도수 계산해서 저장
11+
* 빈도수를 기준으로 내림차순 정렬된 buckets 배열 생성 후,
12+
* 각 숫자를 빈도수[freq]에 해당하는 버킷에 넣기
13+
* 결과 리턴할 빈 배열 만들어주고,
14+
* 가장 높은 빈도수부터 시작하여 k개의 요소를 결과 배열에 추가
15+
* 반복문 끝나면 결과값 리턴
16+
*/
17+
18+
/**
19+
* @param {number[]} nums
20+
* @param {number} k
21+
* @return {number[]}
22+
*/
23+
var topKFrequent = function (nums, k) {
24+
const frequencyMap = new Map();
25+
26+
for (const num of nums) {
27+
frequencyMap.set(num, (frequencyMap.get(num) || 0) + 1);
28+
}
29+
30+
const buckets = Array(nums.length + 1)
31+
.fill()
32+
.map(() => []);
33+
34+
for (const [num, freq] of frequencyMap) {
35+
buckets[freq].push(num);
36+
}
37+
38+
const result = [];
39+
40+
for (let i = buckets.length - 1; i >= 0 && result.length < k; i--) {
41+
if (buckets[i].length > 0) {
42+
result.push(...buckets[i].slice(0, k - result.length));
43+
}
44+
}
45+
46+
return result;
47+
};

0 commit comments

Comments
 (0)