Skip to content

Commit 8b3836f

Browse files
top k frequent elements solution
1 parent 4701189 commit 8b3836f

File tree

1 file changed

+44
-0
lines changed

1 file changed

+44
-0
lines changed
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
from typing import List
2+
3+
4+
class Solution:
5+
"""
6+
풀이:
7+
- λΉˆλ„μˆ˜ μ„ΈκΈ° + Bucket Sortλ₯Ό μ‘°ν•©ν•΄μ„œ μ •λ ¬ 없이 O(n)에 μƒμœ„ k개λ₯Ό λ½‘λŠ”λ‹€.
8+
- 1단계: numsλ₯Ό μˆœνšŒν•˜λ©° 각 숫자의 λ“±μž₯ 횟수λ₯Ό dict둜 μ„Όλ‹€.
9+
- 2단계: λΉˆλ„μˆ˜λ₯Ό 인덱슀둜 ν•˜λŠ” 버킷 배열을 λ§Œλ“ λ‹€.
10+
λΉˆλ„μˆ˜λŠ” μ΅œλŒ€ len(nums)μ΄λ―€λ‘œ λ°°μ—΄ 크기가 고정됨.
11+
- 3단계: 버킷 배열을 λ’€μ—μ„œλΆ€ν„°(높은 λΉˆλ„μˆ˜λΆ€ν„°) μˆœνšŒν•˜λ©° k개λ₯Ό μˆ˜μ§‘ν•œλ‹€.
12+
- μ •λ ¬(O(n log n)) λŒ€μ‹  λ²„ν‚·μ˜ 인덱슀 μžμ²΄κ°€ μ •λ ¬ 역할을 ν•˜λ―€λ‘œ O(n).
13+
14+
TC: O(n)
15+
- λΉˆλ„μˆ˜ μ„ΈκΈ°: numsλ₯Ό ν•œ 번 순회. O(n).
16+
- 버킷 λ°°μ—΄ 생성: 고유 μ›μ†Œ 수만큼 순회. μ΅œμ•… O(n).
17+
- μƒμœ„ k개 μˆ˜μ§‘: 버킷 배열을 λ’€μ—μ„œλΆ€ν„° 순회. μ΅œμ•… O(n).
18+
- μ’…ν•©: O(n).
19+
20+
SC: O(n)
21+
- counts(dict): μ΅œμ•… n개의 고유 μ›μ†Œ. O(n).
22+
- bucket(list of lists): 크기 n+1. O(n).
23+
- answer(list): μ΅œλŒ€ k개. O(k) ≀ O(n).
24+
- μ’…ν•©: O(n).
25+
"""
26+
def topKFrequent(self, nums: List[int], k: int) -> List[int]:
27+
counts = dict()
28+
for num in nums:
29+
if num not in counts:
30+
counts[num] = 0
31+
counts[num] += 1
32+
33+
bucket = [[] for _ in range(len(nums) + 1)]
34+
for num, cnt in counts.items():
35+
bucket[cnt].append(num)
36+
37+
answer = []
38+
for cnt_list in reversed(bucket):
39+
if not cnt_list:
40+
continue
41+
for num in cnt_list:
42+
answer.append(num)
43+
if len(answer) == k:
44+
return answer

0 commit comments

Comments
Β (0)