|
| 1 | +""" |
| 2 | +Constraints: |
| 3 | +
|
| 4 | +1 <= nums.length <= 10^5 |
| 5 | +-10^4 <= nums[i] <= 10^4 |
| 6 | +k is in the range [1, the number of unique elements in the array]. |
| 7 | +
|
| 8 | +nums ๋ฐฐ์ด์์ ์์๋ค์ ๋น๋์ ์ค, ๊ฐ์ฅ ๋น๋์๊ฐ ๋์ k๊ฐ์ ์๋ค ๋ฐํ |
| 9 | +
|
| 10 | +Time Complexity: O(klogn) |
| 11 | +
|
| 12 | +๋ด๋ถ์ ์ผ๋ก ์ ๋ ฌ๋๋ O(logn)์ ๊ฐ์ง๋ ์ต์ ํ ์ฌ์ฉ? |
| 13 | +
|
| 14 | +์ฐ์ ๋น๋์ ์ฌ์ ์ ๊ธฐ๋ก -> dict[์ซ์] = ๋น๋์ O(n) |
| 15 | +๊ทธ ๋ค์, ์ฌ์ .items() ๋๋ฉด์ heap ์ k๊ฐ ๋งํผ ๋ฃ๊ธฐ O(k * logn) |
| 16 | +
|
| 17 | +k๊ฐ ๋งํผ ์ฐ์ ์์ ํ์ ๋ฃ๊ธฐ (-๋น๋์, ์ซ์) -> ํํ ๋ฃ์ผ๋ฉด ์ฒซ๋ฒ์จฐ ์์๊ธฐ์ค์ผ๋ก ์ ๋ ฌ๋จ |
| 18 | +
|
| 19 | +๊ทธ๋ฆฌ๊ณ , ๋๋จธ์ง ์ฌ์ .items() ๋งํผ for i in range(k + 1, n) ๋งํผ๋ง ๋๊ธฐ |
| 20 | +-> ๋ง์ฝ ํ์ ๋งจ ์ ๊ฐ๋ณด๋ค ์์ผ๋ฉด ๋ฃ๊ณ , ์๋๋ผ๋ฉด pass |
| 21 | +
|
| 22 | +Space Complexity: O(n) |
| 23 | +
|
| 24 | +nums๋งํผ ์ฌ์ ์ ๋น๋์ ์ ์ฅ |
| 25 | +
|
| 26 | +# ๊ฐ๊ณผํ ์ฌ์ค |
| 27 | +์ฒซ k๊ฐ๋ง ์ฐ์ ์์ ํ์ ๋ฃ๊ณ , ๋๋จธ์ง n - k ๋งํผ ๋๋, |
| 28 | +ํ์ ๋งจ ์ ๊ฐ๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ๋ -> ๋งจ ์ ๊ฐ์ ๋นผ๋ฉด ์๋จ!! ๊ทธ๊ฒ ์ ๋ต ์ ์ค ํ๋์ผ ์ ์์ |
| 29 | +
|
| 30 | +
|
| 31 | +์๋ฟ์ธ..๋งจ ์ ๊ฐ๋ง ์ ๋ ฌ๋์ด์๋ ์ํ๋ผ, ๋ง์ง๋ง ๊ฐ ๋ฐํ ์ heappop์ผ๋ก ํด์ค์ผํ ๋ฏ! |
| 32 | +๋จ์ํ for i in range(k) ํด์ ๋งจ ์ k ๊ฐ๋ฅผ ๋ฐํํ๋ฉด ์ ๋ ฌ๋์ง ์์ ์ํ์์ ๊ฐ์ ๋ฝ์๋ด๋ฏ๋ก ํ๋ฆด ์ ์์ |
| 33 | +
|
| 34 | +# ๋ฐ๋ก |
| 35 | +
|
| 36 | +[2,3,4,1,4,0,4,-1,-2,-1] |
| 37 | +
|
| 38 | +๋งจ ์์ ๊ฐ์ด๋๋ง ๋น๊ตํ๋ค๋ณด๋, ์ต๋ ๋น๋์ ๊ฐ์ ์ ํํ ๋์ค๋๋ฐ ๋ ๋ฒ์งธ ์ดํ ๊ฐ์ด ์ฒซ ๋ฒ์งธ ๊ฐ๋ณด๋ค ์์ง ์์์ ํ์ ๋ชป ๋ค์ด์จ๋ค.. |
| 39 | +๊ทธ๋์, ๋งจ ์์ ๊ฐ ๋น๊ต ๋ก์ง ์์ฐ!! |
| 40 | +
|
| 41 | +ํ์ง๋ง, ํ ๋ด ์์๋ฅผ k๊ฐ๋ฅผ ์ ์ง ๋ชปํด์ ์ ๋ ฌ ์๊ฐ์ด log N ์ด ๋์ด๋ฒ๋ฆผ.. |
| 42 | +-> heap์ ์ฌ์ด์ฆ๋ฅผ k๋ก ์ ์งํ๋ฉด์ ์์ ๋น๋ ์๋ถํฐ ์ ๊ฑฐํ๋ฉด, |
| 43 | +๊ฒฐ๊ตญ heap ์์๋ ๊ฐ์ฅ ๋ง์ด ๋ฑ์ฅํ k๊ฐ์ ์์๋ง ๋จ๋๋ค. |
| 44 | +""" |
| 45 | + |
| 46 | +from collections import defaultdict |
| 47 | +from heapq import heappush, heappop |
| 48 | + |
| 49 | + |
| 50 | +class Solution: |
| 51 | + def topKFrequent(self, nums: List[int], k: int) -> List[int]: |
| 52 | + freq_dict = defaultdict(int) |
| 53 | + min_heap = [] |
| 54 | + ret = [] |
| 55 | + |
| 56 | + for n in nums: |
| 57 | + freq_dict[n] += 1 |
| 58 | + |
| 59 | + for key, value in freq_dict.items(): |
| 60 | + heappush(min_heap, (value, key)) |
| 61 | + if len(min_heap) > k: |
| 62 | + heappop(min_heap) |
| 63 | + |
| 64 | + for _ in range(k): |
| 65 | + ret.append(heappop(min_heap)[1]) |
| 66 | + |
| 67 | + return ret |
0 commit comments